Чтобы получить именно то, что вы указали в качестве желаемого результата (за вычетом того факта, что это 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