SQL “entre” ne sont pas inclus
J'ai une requête comme ceci:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Mais cela ne donne pas de résultats, même si il existe des données sur la 1ère.
created_at
ressemble 2013-05-01 22:25:19
, je soupçonne qu'il a à faire avec le temps? Comment cela pourrait-il être résolu?
Il fonctionne très bien si je n'ai plus grandes plages de dates, mais il devrait (inclus) travaux avec une date unique aussi.
- Eh bien, combien de numéros sont compris entre 1 et 1? Devrait 1.5 être comprise entre 1 et 1? il suffit de ne pas utiliser ENTRE de date et d'heure des plages. Jamais. Et faire attention à la façon dont vous évaluez "fonctionne très bien" - avez-vous inspecté de près les résultats de la dernière journée dans la gamme? Vous ne comprendraient que toutes les lignes si ils n'ont pas de temps associé avec eux.
Vous devez vous connecter pour publier un commentaire.
Il est inclusive. Vous comparez datetimes de dates. La deuxième date est interprétée comme minuit quand la journée commence.
Un moyen de résoudre ce problème est:
Un autre moyen pour résoudre ce problème est explicite des comparaisons binaires
Aaron Bertrand a une longue entrée de blog sur les dates (ici), où il discute de cela et d'autres problèmes de la date.
dateadd
pour obtenir le lendemain.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) et ouvert à l'autre (<
) combiné avec la fonction de vérification, un jour, au-delà de la date de fin spécifiée.where
clause, car il va perdre tout l'indexation dont il dispose. C'est vraiment un mauvais modèle.Il a été supposé que la deuxième date de référence dans le
BETWEEN
syntaxe est comme par magie considérée comme la "fin de journée", mais c'est faux.c'est à dire ce qui était attendu:
mais ce qui arrive est-ce:
Qui devient l'équivalent d':
Le problème, c'est l'une des perceptions et des attentes à propos de
BETWEEN
qui ne comprennent à la FOIS la valeur inférieure et la partie supérieure des valeurs dans la plage, mais ne pas comme par magie faire un jour le "début" ou "fin".BETWEEN
doit être évité lors de filtrage par des plages de dates.Toujours utiliser le
>= AND <
au lieules parenthèses sont facultatives ici, mais peut être important dans des requêtes plus complexes.
Vous avez besoin de faire 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 que vous devrez ensuite 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. Aussi, Aaron Bertrand a une explication très claire sur pourquoi il doit être utilisé.
BETWEEN
pour la plage de dates des requêtes incluant des temps; trop beaucoup de choses peuvent mal se passer.Suffit d'utiliser l'horodatage date:
'DATE' is not a recognized built-in function name.
Besoin de convertir stackoverflow.com/a/20973452/4233593Je trouve que la meilleure solution pour la comparaison d'un champ de date /heure pour un champ date est le suivant:
C'est équivalent à un système inclusif entre la déclaration, car elle comprend à la fois le début et date de fin ainsi que ceux qui tombent entre.
Qui fonctionnera qu'en 2008 et les nouvelles versions de SQL Server
Si vous utilisez une version plus ancienne, puis utiliser
convert(varchar, created_at, 101)
résultat est commedd/MM/yyyy
et OP chaînes sontyyyy-MM-dd
, je pense que cette réponse ne fonctionnera pas ;).Vous pouvez utiliser le
date()
fonction qui va extraire la date à partir d'un datetime et vous donner le résultat sous la forme inclusive date: