sophia kylie taylor Ответов: 3

Выберите последние 2 часа в базе данных (конкретные часы)


Привет, я хотел бы попросить вашей помощи о том, как я мог бы получить 2-часовые данные из базы данных, на определенный час. Как только запрос будет запущен, например, к 3 часам дня, он получит данные 1:00-3:00 вечера. Надеюсь, вы могли бы помочь мне изменить приведенный ниже запрос.

Что я уже пробовал:

SELECT *
FROM
dbo.Products where
[LoadingDateTime] >= DATEADD(Hour, -2, GETDATE())
group by [LoadingDateTime]
order by [LoadingDateTime] asc

MadMyche

Так что в принципе, если вы запускаете его в 3:01 вечера, вы хотите с 1:00 вечера до 3:00 вечера; вроде как вы этого хотите круглый время до "твердого" часа?

3 Ответов

Рейтинг:
5

Richard Deeming

Небольшая вариация решения 2, которая позволит SQL использовать индекс в вашем столбце даты (если таковой имеется):

DECLARE @Now datetime = GETDATE();
DECLARE @Max datetime = DateAdd(hour, DateDiff(hour, 0, @Now), 0);
DECLARE @Min datetime = DateAdd(hour, -2, @Max);

SELECT [LoadingDateTime]
FROM dbo.Products 
WHERE [LoadingDateTime] >= @Min And [LoadingDateTime] < @Max
GROUP BY [LoadingDateTime]
ORDER BY [LoadingDateTime] ASC;
Несаргируемые Предикаты - Brent Ozar Unlimited®[^]
sql server - T-SQL datetime округляется до ближайшей минуты и ближайших часов с использованием функций - переполнение стека[^]


Рейтинг:
1

CHill60

София сказала::
более ранние минуты не были захвачены, так как они зависят от даты и времени запуска сценария.
Я думаю, что под этим вы подразумеваете, что если текущее время равно 11:14, то Решение 1 буквально вернет все в течение последних 2 часов, то есть с 9:14 до 11:14, но на самом деле вы хотите все с 09:00 до 11:00.

Если это так, то @RamiroX близок. Попробуй
SELECT [LoadingDateTime]
FROM
@Products where
DATEDIFF(hour, [LoadingDateTime], getdate()) <= 2
group by [LoadingDateTime]
order by [LoadingDateTime] asc


Еще один момент:
- Не используйте Select * если используется группировка по - перечислите столбцы явно. Честно говоря, это справедливо в целом для хорошей практики кодирования.


Richard Deeming

Этот запрос не будет SARGable. Вероятно, было бы лучше рассчитать время начала и окончания вместо этого. :)

CHill60

Хорошая мысль, о том, чтобы 5 ваше решение!

Рейтинг:
0

phil.o

Вам просто нужно указать верхнюю границу диапазона (вы указали только нижнюю границу):

-- Version 1
SELECT
 *
FROM
 dbo.Products
WHERE
 [LoadingDateTime] >= DATEADD(Hour, -2, GETDATE())
 AND [LoadingDateTime] <= GETDATE()
ORDER BY
 [LoadingDateTime] ASC

-- VERSION 2
SELECT
 *
FROM
 dbo.Products
WHERE
 [LoadingDateTime] BETWEEN DATEADD(Hour, -2, GETDATE()) AND GETDATE()
ORDER BY
 [LoadingDateTime] ASC


sophia kylie taylor

есть ли в любом случае я мог бы получить данные в течение определенного часа? Когда я попытался запустить сценарий, более ранние минуты не были записаны, так как они зависят от даты и времени запуска сценария. очень ценю вашу помощь.

phil.o

Извините, я не понимаю -более ранние минуты не были захвачены. Можете ли вы привести пример с конкретными данными?

RamiroX

Как насчет использования функции DATEDIFF, такой как DATEDIFF(hour, LoadingDateTime, GETDATE()) = 2 ?