Лучший способ удалить часть времени поля datetime - это использовать функции datediff и dateadd.
DateAdd(day, datediff(day,0, MydateValue), 0)
Это использует тот факт, что SQL Server хранит даты в виде двух целых чисел, одно из которых представляет количество дней с дня "0" - (1 января 1900 года), а второе - число * 1005. * тики (каждый тик составляет около 3,33 мс) с полуночи (для времени) *.
формула выше просто должна прочитать только первое целое число. Там нет преобразования или обработки не требуется, поэтому это очень быстро.
Чтобы ваши запросы использовали индекс ... сначала используйте эту формулу для входных параметров фильтрации или на "другой" стороне знака равенства из поля даты и времени таблиц, чтобы оптимизатору запросов не приходилось выполните вычисление для каждого поля даты и времени в таблице, чтобы определить, какие строки удовлетворяют предикату фильтра. Это делает ваш аргумент поиска "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 х 60 х 60 х 300 = 25 920 000 тиков (по счастливой случайности чуть ниже максимального значения, которое может содержать 32-битное целое число). Однако вам не нужно беспокоиться об этом при арифметическом изменении даты и времени ... При добавлении или вычитании значений из даты и времени вы можете рассматривать значение как дробь, как если бы она была точно равна дробной части дня, как если бы полное значение datetime было числом с плавающей запятой, состоящим из целой части, представляющей дату, и дробной части, представляющей время). т.е.
`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`