web-dev-qa-db-fra.com

SQL Server: récupérer des enregistrements entre deux dates?

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.

15
Ssasidhar

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?

14
ypercubeᵀᴹ

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'.

11
Oded

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. 

2
greg

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.

1
RichardTheKiwi

Essaye ça:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
1
krishnang

essayez d'utiliser la requête suivante

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
0
Hiren Dhaduk