web-dev-qa-db-fra.com

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

J'utilise MS SQL 2005 et je veux vérifier l'égalité de deux dates, mais en ignorant la partie temps.

Je sais que je peux utiliser DATEIFF , mais je crains que cela ne soit lent - ceci SP s'utilise dans le DB beaucoup!

Aucune suggestion?

Modifier: Commentaire de David Andres:

"La" comparaison "comprend bien plus que l'égalité"

La façon la plus raisonnable de le faire est de supprimer la partie temporelle des valeurs datetime et de comparer les résultats, et la meilleure façon de supprimer la partie temporelle d'un datetime est la suivante:

cast(current_timestamp as date)    

J'ai utilisé et préconisé 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 le type Date, qui ne contient pas de composant time, il n'y a plus de raison d'utiliser l'une ou l'autre de ces techniques.

Une autre chose à garder à l'esprit est que cela va encore enliser une requête si vous devez le faire pour deux valeurs datetime pour chaque ligne d'une clause where ou d'une condition de jointure. Si possible, vous voulez en tenir compte d'une manière ou d'une autre afin qu'il soit pré-calculé autant que possible, par exemple en utilisant une vue ou une colonne calculée.

Enfin, notez que la fonction DATEDIFF compare le nombre de frontières franchies. Cela signifie que le datiff en jours entre '2009-09-14 11:59:59' et '2009-09-15 00:00:01' est 1, même si seulement 2 secondes se sont écoulées, mais le DATEDIFF en jours entre '2009-09-15 00:00:01' et '2009-09-15 11:59:59' est toujours nul, même si 86 398 secondes se sont écoulées. Il ne se soucie pas vraiment du temps, mais seulement des limites. Selon ce que votre requête essaie de faire, vous pourrez peut-être l'utiliser à votre avantage.

90
Joel Coehoorn

OERE DATE DIFF (jour, date1, date2) = 0

37
pete

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 bien plus que l'égalité et ce qui précède convertit les dates au format américain MM/DD/YYYY avant d'effectuer la comparaison. Donc, implications sur les performances et incapacité à comparer les différences de date.

Mais, il fonctionne.

7
David Andres

Si l'une de vos exigences commerciales n'est pas bien servie par votre modèle de données (par exemple, vous avez besoin de comparer les dates, mais vous ne suivez pas les dates, uniquement les dates et heures), 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 de date et d'heure séparément?

4
Steve Kass

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

3
Thomas