J'ai une requête comme celle-ci:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Mais cela ne donne aucun résultat même s'il existe des données sur le 1er.
created_at
ressemble 2013-05-01 22:25:19
, je soupçonne que cela a à voir avec le temps? Comment cela pourrait-il être résolu?
Cela fonctionne très bien si je fais des plages de dates plus grandes, mais cela devrait également fonctionner avec une seule date.
sql
sql-server
sql-server-2008
tsql
date
JBurace
la source
la source
Réponses:
Il est inclus. Vous comparez les dates et les dates. La deuxième date est interprétée comme minuit lorsque la journée commence .
Une façon de résoudre ce problème est:
Une autre façon de résoudre ce problème consiste à utiliser des comparaisons binaires explicites
Aaron Bertrand a une longue entrée de blog sur les dates ( ici ), où il discute de ceci et d'autres questions de date.
la source
dateadd
pour obtenir le lendemain.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) et ouvert à l'autre (<
) combiné avec une vérification un jour après la date de fin spécifiée.where
clause, car elle perdra toute indexation dont elle dispose. C'est un très mauvais modèle.On a supposé que la deuxième référence de date dans la
BETWEEN
syntaxe était considérée comme par magie comme la «fin de la journée», mais ce n'est pas vrai .c'est-à-dire que c'était prévu:
mais ce qui se passe vraiment est ceci:
Ce qui devient l'équivalent de:
Le problème est l' une des perceptions / attentes au sujet
BETWEEN
qui ne comprennent à la fois la valeur inférieure et les valeurs supérieures de la gamme, mais ne pas faire par magie une date de « début de » ou « la fin de ».BETWEEN
doit être évité lors du filtrage par plages de dates.Utilisez toujours le à la
>= AND <
placeles parenthèses sont facultatives ici mais peuvent être importantes dans les requêtes plus complexes.
la source
Vous devez effectuer l'une de ces deux options:
between
condition:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(non recommandé ... voir le dernier paragraphe)between
. Notez qu'alors vous devrez ajouter un jour à la deuxième valeur:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
Ma préférence personnelle est la deuxième option. De plus, Aaron Bertrand a une explication très claire sur les raisons pour lesquelles il devrait être utilisé.
la source
BETWEEN
pour les requêtes de plage de dates qui incluent l'heure; trop de choses peuvent mal tourner.Utilisez simplement l'horodatage comme date:
la source
'DATE' is not a recognized built-in function name.
doit convertir stackoverflow.com/a/20973452/4233593Je trouve que la meilleure solution pour comparer un champ datetime à un champ date est la suivante:
Cela équivaut à une instruction inclusive entre car elle inclut à la fois la date de début et de fin ainsi que celles qui se situent entre les deux.
la source
Cela ne fonctionnera qu'en 2008 et dans les versions plus récentes de SQL Server
Si vous utilisez une version plus ancienne, utilisez
la source
convert(varchar, created_at, 101)
le résultat est commedd/MM/yyyy
et les chaînes de OP sontyyyy-MM-dd
, je pense que cette réponse ne fonctionnera pas;).Vous pouvez utiliser la
date()
fonction qui extraira la date d'une date / heure et vous donnera le résultat comme date inclusive:la source
Date Dyamic BETWEEN requête SQL
la source