Что такое синтаксис TSQL для выбора строк между значениями DateTime - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть данные с 5-минутными интервалами с 24-часовыми пролонгациями, например:

LogTime
-------------
7/1/2017 7:01
7/1/2017 7:06
7/1/2017 7:11
7/1/2017 7:16
...
7/2/2017 6:56

Мне нужен запрос TSQL, чтобы выбрать все строки для данной даты, например, записи из 07/02 00:00:00 до 07/02 06:59:59 считаются частью данных 07/01.

Я использую этот запрос на панели редактора SSMS:

SELECT * FROM [LogEntries] WHERE [LogTime] BETWEEN '20170701 06:59:59' AND '20170702 07:00'

Проблема в том, чтостроки должны быть логически построены из DateTime значений.

Можно ли это сделать в одном операторе запроса с переданными DateTime параметрами?Я делаю это для отчета SSRS, и я бы не стал прибегать к хранимой процедуре, если мне это не нужно.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вопрос гласит: «Проблема в том, что строки должны быть логически построены из значений DateTime».

В документации BETWEEN (Transact-sql) , цитируемой OP,пример D (для datetime) говорит это:

D.Использование BETWEEN со значениями даты и времени

В следующем примере извлекаются строки, в которых значения даты и времени находятся между '20011212' и '20020105' включительно.

SELECT BusinessEntityID, RateChangeDate
FROM HumanResources.EmployeePayHistory
WHERE RateChangeDate МЕЖДУ '20011212' И '20020105';

Похоже, что значения DateTime необходимо указывать в виде строк.Они неВы можете использовать datetimes.

Ответ Зохара посвящен изменяющейся во времени части проблемы.

0 голосов
/ 26 апреля 2018

Самое простое решение (хотя и не sargable , поэтому оно может быть не самым лучшим) - просто вычесть 7 часов из ваших LogTime значений:

DECLARE @DateTime DateTime = GETDATE();

SELECT * 
FROM [LogEntries] 
WHERE CAST(DATEADD(HOUR, -7, [LogTime]) AS DATE) = CAST(@DateTime AS DATE);

Sargable решениеэто немного более громоздко, но все же довольно просто:

SELECT * 
FROM [LogEntries] 
                   -- 07 am on the date of the @DateTime variable
WHERE [LogTime] >= CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime) 
                 -- 07 am one day after the date of the @DateTime variable
AND  [LogTime] < DATEADD(DAY, 1, CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime)) 

Конечно, если вы передадите переменную Date вместо DateTime, это сэкономит вам одно преобразование (вы можете использовать + длясложите datetime значения вместе, но не date + time, так что вам все равно придется преобразовать в datetime):

SELECT * 
FROM [LogEntries] 
                -- 7 AM
WHERE [LogTime] >= CAST(@Date As DateTime) + CAST('00:07:00' As DateTime)
                -- 7 AM on the next day
AND  [LogTime] <= DATEADD(DAY, 1, CAST(@Date As DateTime) + CAST('00:07:00' As DateTime))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...