Bliv IKKE fristet til at gøre ting som dette:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Dette er en bedre måde:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
se:Hvad betyder ordet "SARGable" egentlig?
EDIT +Der er 2 grundlæggende grunde til at undgå brug af funktioner på data i where-klausulen (eller i joinbetingelser).
- I de fleste tilfælde fjerner brugen af en funktion på data til at filtrere eller joine optimeringsværktøjets mulighed for at få adgang til et indeks på det felt, hvilket gør forespørgslen langsommere (eller mere "dyr")
- Den anden er, at for hver række af data, der er involveret, udføres der mindst én beregning. Det kunne være at tilføje hundreder, tusinder eller mange millioner af beregninger til forespørgslen, så vi kan sammenligne med et enkelt kriterium som
2014-02-07
. Det er langt mere effektivt at ændre kriterierne, så de passer til dataene i stedet.
"At ændre kriterierne, så de passer til dataene" er min måde at beskrive "brug SARGABLE
prædikater"
Og brug heller ikke mellem.
den bedste praksis med dato- og tidsintervaller er at undgå MELLEM og for altid at bruge formularen:
WHERE col>='20120101' OG col <'20120201' Denne formular fungerer med alle typer og alle præcisioner, uanset om tidsdelen er anvendelig.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)