69 votes

Comparer les dates dans T-SQL, en ignorant la partie temps

Je suis à l'aide de MS SQL 2005, et je veux vérifier deux dates pour l'égalité, mais en ignorant le temps de la partie.

Je sais que je peux faire usage de DATEDIFF, mais je suis inquiète de ce que, il peut être lente, cette SP est utilisé dans la DB beaucoup!

Toutes les suggestions?

Edit: David Andres,' commentaire:

'"comparaison" comprend beaucoup plus que de l'égalité"

m'a fait réaliser que je n'ai pas fait ma question assez clair -, je viens tout juste de vérification pour l'égalité, c'est tout.

102voto

Joel Coehoorn Points 190579

La meilleure façon de bande de la partie heure à partir d'un datetime est comme ceci:

cast(current_timestamp as date)    

J'ai l'habitude d'utiliser et de défendre un processus qui ressemblait à l'une des deux lignes suivantes:

cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))

Mais maintenant que Sql Server a l' Date type, qui n'est pas titulaire d'un composant, il y a peu de raisons d'utiliser l'une de ces techniques.

Une chose à garder à l'esprit ici est que c'est toujours d'aller occuper une requête si vous avez besoin de le faire pour les deux valeurs datetime pour chaque ligne dans une clause where ou condition de jointure. Si possible, vous voulez facteur de cela d'une certaine façon alors qu'il est pré-calculé, autant que possible, par exemple à l'aide d'une vue ou une colonne calculée.

Enfin, notez que la fonction DATEDIFF compare le nombre de frontières franchies. Ainsi, le datediff en jours entre '2009-09-14 11:59:59' et '2009-09-15 00:00:01' est de 1, même si seulement 2 secondes s'est écoulé, mais le DATEDIFF en jours entre '2009-09-15 00:00:01' et '2009-09-15 11:59:59' est toujours égale à zéro, même si 86,398 secondes écoulées. Notez qu'il ne s'occupe pas vraiment du tout sur la partie heure là. Selon ce que votre requête est en train de faire, vous pourriez être en mesure de l'utiliser à votre avantage.

42voto

pete Points 168

WHERE DATEDIFF (jour, date1, date2) = 0

7voto

David Andres Points 13569

Dans mon propre travail, lorsque j'ai voulu déterminer que deux dates étaient égales quelle que soit l'heure de la journée, j'ai utilisé ce qui suit:

 WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
 

Certes, la "comparaison" comprend beaucoup plus que l'égalité et ce qui précède convertit les dates au format USA MM / JJ / AAAA avant d'effectuer la comparaison. Donc, conséquences sur les performances et incapacité à comparer les différences de dates.

Mais, il fonctionne.

4voto

Steve Kass Points 4738

Si votre modèle de données ne répond pas à l'une de vos exigences professionnelles (par exemple, vous devez comparer les dates, mais vous ne gardez pas trace de ces dates, mais uniquement de la date et de l'heure), examinez la possibilité de régler le modèle, pas la méthode pour y faire face.

Serait-il possible et utile de stocker la date uniquement dans une colonne calculée indexée ou de stocker les parties date et heure séparément?

3voto

Thomas Points 6809

Désolé de la réponse tardive.

J'utilise toujours cette syntaxe pour la comparaison des dates

 WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112)
 

cela fonctionne toujours très bien chaque fois que nous convertissons la date au format 112, elle renvoie la date au format yyyyMMdd . il compare la date au format chaîne sans heure mais fonctionne très bien. Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X