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).
- 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")
- 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)