Par exemple, peut
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
sélectionnez 5 et 10 ou ils sont exclus de la gamme?
la source
Par exemple, peut
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
sélectionnez 5 et 10 ou ils sont exclus de la gamme?
L'opérateur BETWEEN est inclusif.
De Livres en ligne:
BETWEEN renvoie TRUE si la valeur de test_expression est supérieure ou égale à la valeur de begin_expression et inférieure ou égale à la valeur de end_expression.
DateTime Caveat
NB: Avec DateTimes il faut faire attention; si seule une date est donnée, la valeur est prise à minuit ce jour-là; pour éviter de manquer des heures dans votre date de fin ou de répéter la capture des données du jour suivant à minuit dans plusieurs plages, votre date de fin doit être de 3 millisecondes avant minuit le jour suivant votre date de fin. 3 millisecondes car moins que cela et la valeur sera arrondie à minuit le lendemain.
Par exemple, pour obtenir toutes les valeurs en juin 2016, vous devez exécuter:
where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')
c'est à dire
where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'
Soustraire 3 ms d'une date vous rendra vulnérable aux lignes manquantes de la fenêtre de 3 ms. La bonne solution est également la plus simple:
where myDateTime >= '20160601' AND myDateTime < '20160701'
CONVERT
un datetime à une date , car cela rendra les index inutiles. Utilisez la normeWHERE OrderDate >= '20160601' AND OrderDate < '20160701'
. Assurez-vous également de l'utiliseryyyymmdd
, car celayyyy-mm-dd
dépend des paramètres régionaux, et sera mal interprété en fonction desmdy, dmy, ymd, ydm, myd, and dym
paramètres de votre serveur .Oui, mais soyez prudent lorsque vous utilisez entre les dates.
est vraiment interprété comme 12h, ou
manquera donc tout ce qui s'est passé pendant la journée du 31 janvier. Dans ce cas, vous devrez utiliser:
ou
MISE À JOUR : Il est tout à fait possible d'avoir des enregistrements créés dans cette dernière seconde de la journée, avec une date et l'heure aussi tard que
20090101 23:59:59.997
!!Pour cette raison, l'
BETWEEN (firstday) AND (lastday 23:59:59)
approche n'est pas recommandée.Utilisez
myDate >= (firstday) AND myDate < (Lastday+1)
plutôt l' approche.Bon article sur cette question ici .
la source
WHERE col BETWEEN 'a' AND 'z'
excluront également la plupart des lignes z par exemple.BETWEEN 5 AND 10
n'inclut pas10.2
...CAST
ing ladatetime
commeDATE
travaillerait:CAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
.It is entirely possible to have records created within that last second of the day, with a datetime as late as 01/01/2009 23:59:59.997
<- ne pourriez-vous pas utiliser à ce moment-làAND '01/31/2009 23:59:59.99999999'
ou autant de 9 sont nécessairesExemple du monde réel de SQL Server 2008.
Données source:
Requete:
Résultats:
la source
ID = 3
exclu? SaStart
valeur est égale à laBETWEEN
valeur de la limite supérieure etBETWEEN
est une plage inclusive, pas une plage supérieure exclusive.si vous frappez ceci et que vous ne voulez pas vraiment essayer d'ajouter un jour dans le code, laissez la DB le faire.
Si vous incluez la partie heure: assurez-vous qu'elle fait référence à minuit. Sinon, vous pouvez simplement omettre l'heure:
et ne vous en faites pas.
la source
la source
Si le type de données de la colonne est datetime, vous pouvez procéder comme suit pour éliminer l'heure de datetime et comparer uniquement la plage de dates.
la source
Cela inclut les limites.
la source
Je l'ai toujours utilisé:
O my ma date entre la date de début ET (date de fin + 1)
la source