Чтобы получить именно то, что вы указали в качестве желаемого результата (за вычетом того факта, что это INT
вместо TIME
; ничего сложного в исправлении),
SELECT DISTINCT DATEPART(HOUR, TimeStamp)
FROM Observations
Вы также можете добавить CAST(TimeStamp AS DATE)
, если хотите.
Предполагая, что вам также нужны данные, это немного зависит, но от того, что вы описали, простое решение просто сказать:
SELECT *
FROM Observations
WHERE DATEPART(MINUTE, TimeStamp) = 0
Однако это не удается, если у вас отсутствуют данные, что довольно часто.
Если у вас есть несколько часов, когда вам нужны данные, но нет строки в :00, вы можете сделать что-то вроде этого:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY CAST(TimeStamp AS DATE), DATEPART(HOUR, TimeStamp) ORDER BY TimeStamp)
FROM Observations
)
SELECT *
FROM cte
WHERE n = 1
Это займет первое место для любой комбинации даты/часа.
Конечно, вы по-прежнему пропускаете все, о чем у вас не было данных в течение целого часа. Для этого потребуется таблица чисел, если вы даже хотите вернуть эти экземпляры.
28.12.2015