Самое простое решение (хотя и не 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))