Вы можете преобразовать значение и поля в date
, например:
where cast(dateTimeField as date) =cast(dateadd(day,-1,getdate()) as date)
SQL Server достаточно умен, чтобы преобразовать его в запрос диапазона:
WHERE dateField >= '2018-10-10 00:00:00' and datefield <'2018-10-11 00:00:00`
Это позволяет серверу использовать любые индексы, которые охватывают dateField
, и выполнять быстрый запрос.
В любом другом случае применение функции к полю не позволит серверу использовать индексы
ОБНОВЛЕНИЕ
Для сомневающихся и необъяснимых downvoters, давайте создадим таблицу с записями 50K:
create table TestDates(
id int primary key identity,
Name nvarchar(20),
Created datetime,
INDEX IX_TestDates_Created(Created)
);
insert into TestDates(Name,Created)
select FORMAT(n,'John Doe {0}'), dateadd(hour,n,'2017-08-01 16:55:47')
from Numbers
where n<=50000
Это создает 50K записей до 2023, с24 записи в день.
План выполнения для этого запроса:
select count(*),min(created),max(created)
from TestDates
where cast(created as date)=cast(dateadd(day,-1,getdate()) as date)
Показывает поиск индекса по индексу вместо сканирования.
Предикат поиска для операции поиска по индексу:
Start: [Test].[dbo].[TestDates].Created > Scalar Operator([Expr1012]),
End: [Test].[dbo].[TestDates].Created < Scalar Operator([Expr1013])
С результатами:
24 2018-10-11 00:55:47.000 2018-10-11 23:55:47.000