Как я могу показать данные за предыдущий день до 23:59

Как я могу показать данные за предыдущий день до 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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
678
4

Ответы 4

Вы можете преобразовать значение а также в поле в 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

Кто-нибудь хочет объяснить отрицательный голос? В конце концов, он только идентичен другим ответам ...

Panagiotis Kanavos 12.10.2018 10:38

Вы можете попробовать, как показано ниже.

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 также позволяет серверу использовать индекс, поскольку условие преобразуется в запрос диапазона
Panagiotis Kanavos 12.10.2018 10:38

Вы можете использовать комбинацию 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())))

Это никак не влияет на производительность. Кастинг на сегодняшний день чище

Panagiotis Kanavos 12.10.2018 11:18

С другой стороны, предположение, что после 23:59:59 не будет никаких записей, гарантирует, что некоторые строки будут потеряны. Поэтому BETWEEN нельзя использовать в таких запросах. Это должен быть запрос, подобный тому, который отправил Гордон, с < для правой границы.

Panagiotis Kanavos 12.10.2018 11:20

Совершенно верно. Я отредактировал свой ответ. Использование dateiff и dateadd улучшает обратную совместимость до 2008 года, когда был представлен тип данных DATE.

OWSam 12.10.2018 11:23

Другие вопросы по теме