Как я могу показать данные предыдущего дня до 23:59 - PullRequest
0 голосов
/ 11 октября 2018

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

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

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

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

WHERE dateField < convert(date, getdate() -1)
0 голосов
/ 11 октября 2018

Я бы предложил:

where col < cast(getdate() as date) and
      col >= dateadd(day, -1, cast(getdate() as date))

Эта формулировка позволяет SQL Server использовать индекс для col, если доступен соответствующий.

Если вас это не волнуетИндексы можно сделать:

where datediff(day, col, getdate) = 1
0 голосов
/ 11 октября 2018

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

Показывает поиск индекса по индексу вместо сканирования.

enter image description here

Предикат поиска для операции поиска по индексу:

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
...