Comment comparer datetime avec une seule date en SQL Server
Select * from [User] U
where U.DateCreated = '2014-02-07'
mais dans la base de données de l'utilisateur a été créé sur 2014-02-07 12:30:47.220
et quand je ne mets '2014-02-07'
Il ne montre pas toutes les données
Vous devez vous connecter pour publier un commentaire.
NE PAS être tenté de faire des choses comme ceci:
C'est une meilleure façon:
voir: Sargable(la page a été supprimé de Wikipédia)EDIT +
Il y a 2 raisons fondamentales pour éviter l'utilisation de fonctions sur les données dans la clause where (ou dans des conditions de jointure).
2014-02-07
. Il est beaucoup plus efficace de modifier les critères d'adapter les données à la place."Modifiant les critères d'adapter les données" est ma façon de décrire "l'utilisation
SARGABLE
prédicats"Et n'utilisez pas d'entre deux.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)
can
parfois compenser.CAST
sur une colonne indexée supprimer l'index de l'optimiseur, la deuxième raison est souligné dans la réponse peut être assez gênant avec le grand jeu de données.date literal
format "AAAAMMJJ". Types de données de: date ou datetime ou le temps ou datetime2 ou smalldatetime n'ont PAS de format, car ils sont stockés sous forme de nombres. Pour la date de littéraux 'YYYY-MM-DD' est PAS tout à fait sûr, il est l'un des paramètres régionaux qui peuvent mal interpréter cette séquence à être AAAA-JJ-MMSi vous êtes sur SQL Server 2008 ou une version ultérieure, vous pouvez utiliser le type de données de date:
Il convient de noter que si la date de la colonne est indexée alors ce sera encore utiliser l'index et est SARGable. C'est un cas particulier pour les dates et les datetimes.
Vous pouvez voir que SQL Server en fait, transforme ce dans a > et < clause:
AaronsBad
de la base de données va, ces jours-ci?En fonction de votre requête
Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server est en comparant la date exacte et l'heure je.e (en comparant
2014-02-07 12:30:47.220
avec2014-02-07 00:00:00.000
pour l'égalité). c'est pourquoi le résultat de la comparaison est faussePar conséquent, Tout en comparant les dates que vous devez considérer le temps aussi. Vous pouvez utiliser
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
.between
avec est égal aux deux extrémités (>= et <=) par exempleselect * from x where col_1 between 'A' and 'M'
comprend et M (B pour L de cours). Que la nature inclusive debetween
est formidable pour quelque chose comme un index de document; mais pour la date/l'heure des plages, c'est un désastre, parce qu'il crée des chevauchements. Je sais que l'aide entre les ressemble beaucoup, mais, en vérité, unSQL between
juste ne fonctionne pas correctement pour des plages de dates. Toujours utiliser une combinaison de >= et < comme dansU.DateCreated >='2014-02-07' and U.DateCreated < '2014-02-08'
between
est OK. votre suggestion pour l'utilisation>=
et<
est sans aucun doute préférable àbetween
des plages de dates. Je veux juste dire que nous devrions considérer le temps aussi, lorsque l'on compare les dates.De-sûr, c'est un vieux thread, mais pour le rendre complet.
À partir de SQL 2008, vous pouvez utiliser le type de données de DATE de sorte que vous pouvez tout simplement faire:
Vous pouvez utiliser
LIKE
déclaration au lieu de=
. Mais pour ce faire, avec Horodatage, vous devezCONVERT
de la première VARCHAR:S'il vous plaît essayer cette. Cette requête peut être utilisée pour la comparaison de dates