Как я могу показать данные за предыдущий день до 23:59 или 12,
Я запускаю запрос, используя getdate(), тогда он показывает текущую дату текущее время
Например
Execution Datetime -2018-10-11 15:08:42.777
но если мне нужны данные за вчерашний день до 23:59 или 12, я использовал
dateadd(day,-1, getdate()), or Getdate()-1, показывает точно такое же время
2018-10-10 15:08:42.777
Как я могу получить данные за предыдущий день до 11:59 pm


Вы можете преобразовать значение а также в поле в 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, и выполнять быстрый запрос.
В любом другом случае применение функции к полю не позволит серверу использовать индексы.
ОБНОВИТЬ
Для сомневающихся и недовольных голосованием создадим таблицу с 50 КБ записей:
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
Это создает 50 000 записей до 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
Вы можете попробовать, как показано ниже.
WHERE dateField < convert(date, getdate() -1)
Я бы посоветовал:
where col < cast(getdate() as date) and
col >= dateadd(day, -1, cast(getdate() as date))
Эта формулировка позволяет SQL Server использовать индекс на col, если он доступен.
Если вас не интересуют индексы, вы можете:
where datediff(day, col, getdate) = 1
cast(col as date) = somedate также позволяет серверу использовать индекс, поскольку условие преобразуется в запрос диапазона
Вы можете использовать комбинацию DATEDIFF и DATEADD, чтобы получить два значения: одно в 00:00:00 и одно в 23:59:59 вчерашнего дня. Без преобразования в DATE, очень быстро.
DATEADD(DAY,-1, DATEDIFF(DAY,0,getdate())) дает вам вчера 00:00:00
DATEADD(MILLISECOND,-3,DATEADD(DAY,0, DATEDIFF(DAY,0,getdate()))) дает вам вчера 23: 59: 59.997
Пример этого в WHERE запроса для фильтрации до вчерашнего дня,
SELECT *
FROM Sometable
WHERE Sometable.Datecolumn BETWEEN
DATEADD(DAY,-1, DATEDIFF(DAY,0,getdate())) AND DATEADD(MILLISECOND,-3,DATEADD(DAY,0, DATEDIFF(DAY,0,getdate())))
Это никак не влияет на производительность. Кастинг на сегодняшний день чище
С другой стороны, предположение, что после 23:59:59 не будет никаких записей, гарантирует, что некоторые строки будут потеряны. Поэтому BETWEEN нельзя использовать в таких запросах. Это должен быть запрос, подобный тому, который отправил Гордон, с < для правой границы.
Совершенно верно. Я отредактировал свой ответ. Использование dateiff и dateadd улучшает обратную совместимость до 2008 года, когда был представлен тип данных DATE.
Кто-нибудь хочет объяснить отрицательный голос? В конце концов, он только идентичен другим ответам ...