En SQL, j'écris une instruction SELECT
pour extraire des données entre deux dates, en utilisant between and
Ex:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
Mais les lignes retournées sont pour le 26ème seulement, pas les 26ème et 27ème.
Pouvez-vous m'aider? Je vous remercie.
Comme d'autres l'ont répondu, vous avez probablement une colonne DATETIME
(ou une autre variante) et non un type de données DATE
.
Voici une condition qui fonctionne pour tous, y compris DATE
:
SELECT *
FROM xxx
WHERE dates >= '20121026'
AND dates < '20121028' --- one day after
--- it is converted to '2012-10-28 00:00:00.000'
;
@Aaron Bertrand a blogué à ce sujet à l'adresse: Qu'ont en commun BETWEEN
et le diable?
Vous devez être plus explicite et ajouter les heures de début et de fin, jusqu'aux millisecondes:
select *
from xxx
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'
La base de données peut très bien interpréter '2012-10-27'
en tant que '2012-10-27 00:00:00.000'
.
Votre question ne demandait pas comment utiliser correctement BETWEEN, mais demandait de l'aide avec les résultats tronqués de manière inattendue ...
Comme mentionné dans les autres réponses, le problème est que vous avez des tranches horaires en plus des dates.
D'après mon expérience, l'utilisation du diff de date vaut l'usure/déchirure supplémentaire du clavier. Cela vous permet d'exprimer exactement ce que vous voulez et vous êtes couvert.
select *
from xxx
where datediff(d, '2012-10-26', dates) >=0
and datediff(d, dates,'2012-10-27') >=0
en utilisant datiff, si la première date est antérieure à la deuxième date, vous obtenez un nombre positif. Il existe plusieurs façons d'écrire ce qui précède, par exemple en ayant toujours le champ en premier, puis la constante. Il suffit de retourner l'opérateur. C'est une question de préférence personnelle.
vous pouvez indiquer explicitement si vous souhaitez inclure ou non les points de terminaison en supprimant un ou les deux signes identiques.
BETWEEN fonctionnera dans votre cas, car les points d'extrémité sont tous deux supposés être à minuit (c.-à-d. Les DATE). Si vos points de terminaison étaient également DATETIME, l’utilisation de BETWEEN peut nécessiter encore plus de transtypage. Dans mon esprit, DATEDIFF a été mis dans nos vies pour nous isoler de ces problèmes.
La manière non équivoque d’écrire ceci est (c’est-à-dire augmenter la deuxième date de 1 et la rendre <
)
select *
from xxx
where dates >= '20121026'
and dates < '20121028'
Si vous utilisez SQL Server 2008 ou une version ultérieure, vous pouvez utiliser CAST comme DATE tout en conservant SARGability , par exemple.
select *
from xxx
where CAST(dates as DATE) between '20121026' and '20121027'
Cela indique explicitement à SQL Server que la partie DATE de la colonne dates
ne vous intéresse que pour la comparaison avec la plage BETWEEN.
Essaye ça:
select *
from xxx
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
essayez d'utiliser la requête suivante
select *
from xxx
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'