Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment comparer datetime avec seulement date dans SQL Server

NE soyez PAS tenté de faire des choses comme ça :

Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'

C'est une meilleure façon :

Select * from [User] U 
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')

voir :Que signifie vraiment le mot "SARGable" ?

EDIT +Il y a 2 raisons fondamentales pour éviter l'utilisation de fonctions sur les données dans la clause where (ou dans les conditions de jointure).

  1. Dans la plupart des cas, l'utilisation d'une fonction sur les données pour filtrer ou joindre supprime la capacité de l'optimiseur à accéder à un index sur ce champ, ce qui rend la requête plus lente (ou plus "coûteuse")
  2. D'autre part, pour chaque ligne de données impliquée, au moins un calcul est effectué. Cela pourrait ajouter des centaines, des milliers ou plusieurs millions de calculs à la requête afin que nous puissions comparer à un seul critère comme 2014-02-07 . Il est beaucoup plus efficace de modifier les critères en fonction des données à la place.

"Modifier les critères en fonction des données" est ma façon de décrire "utiliser SARGABLE prédicats"

Et n'utilisez pas entre les deux.

la meilleure pratique avec les plages de dates et d'heures est d'éviter ENTRE et de toujours utiliser le formulaire :

WHERE col>='20120101' AND col <'20120201' Ce formulaire fonctionne avec tous les types et toutes les précisions, que la partie horaire soit applicable ou non.

http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)