Най-добрият начин да премахнете времевата част от полето за дата и час е да използвате функциите datediff и dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Това се възползва от факта, че SQL Server съхранява датите като две цели числа, едното представлява броя на дните от деня "0" - (1 януари 1900 г.), а второто представлява броя на отметките (всеки тик е около 3,33 ms) от полунощ (за времето) *.
формулата по-горе просто трябва да прочете само първото цяло число. Не е необходимо преобразуване или обработка, така че е изключително бързо.
За да накарате вашите заявки да използват индекс... използвайте тази формула първо върху входните филтриращи параметри или от "другата" страна на знака за равенство от полето за дата и час на таблиците, така че оптимизаторът на заявките да не трябва да изпълнява изчислението на всяко поле за дата и час в таблицата, за да определи кои редове отговарят на предиката за филтър. Това прави вашия аргумент за търсене „SARG-способен“ (Search ARGument)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
вместо
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* ЗАБЕЛЕЖКА. Вътрешно, второто цяло число (времевата част) съхранява отметки. В един ден има 24 x 60 X 60 X 300 =25 920 000 тика (по случайност точно под максималната стойност, която може да съдържа 32-битово цяло число). Не е нужно обаче да се притеснявате за това, когато аритметично променяте дата и час... Когато добавяте или изваждате стойности от дати и часове, можете да третирате стойността като дроб, сякаш е точно равна на дробната част от деня, сякаш пълната стойност за дата и час беше число с плаваща запетая, състоящо се от цяла част, представляваща датата, и дробна част, представляваща часа). т.е.
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`