Вы можете сгруппировать по этому:
SELECT DateDiff(Hour, 0, GetDate() - TimeStamp)
Если вы хотите узнать время, которое это представляет, вычислите его обратно:
DateAdd(Hour, -DateDiff(Hour, 0, GetDate() - TimeStamp), GetDate())
Если вам не нравится вычитать даты,тогда это еще можно сделать, но становится немного сложнее.Вместо того, чтобы просто снимать в темноте, я разработал запрос, чтобы доказать, что это правильно.
SELECT
TimeStamp,
Now = GetDate(),
HourDiff = DateDiff(Hour, 0, GetDate() - TimeStamp),
HourCalc = DateAdd(Hour, -DateDiff(Hour, 0, GetDate() - TimeStamp), GetDate()),
HourDiff2 = DateDiff(Hour, DateAdd(Millisecond, AdjustMs, TimeStamp), DateAdd(Millisecond, AdjustMs, GetDate())),
HourCalc2 = DateAdd(Hour, -DateDiff(Hour, DateAdd(Millisecond, AdjustMs, TimeStamp), DateAdd(Millisecond, AdjustMs, GetDate())), GetDate())
FROM
(
SELECT DateAdd(Second, -3559, GetDate())
UNION ALL SELECT DateAdd(Second, -3600, GetDate())
UNION ALL SELECT DateAdd(Second, -3601, GetDate())
) x (TimeStamp)
CROSS JOIN (
SELECT 3599997 - DateDiff(Millisecond, 0, DateAdd(Hour, -DateDiff(Hour, 0, GetDate()), GetDate()))
) D (AdjustMs)
К сожалению, мне пришлось использовать свои знания разрешения типа datetime (1/300 секунды), таким образом3600000 - 3 = 3599997. Если бы корректировка в миллисекундах была рассчитана на основе TimeStamp вместо GetDate (), то в этом не было бы необходимости, но это было бы намного сложнее, поскольку большое выражение внутри производной таблицы D пришлось бы использовать дваждыв основном запросе замените AdjustMs.
Расчеты более сложны, чем может показаться необходимым, потому что вы не можете просто вычислить разницу в миллисекундах между случайными датами, иначе вы получите ошибку переполнения.Если вам известны возможные диапазоны дат, вам, возможно, удастся выполнить прямые миллисекундные вычисления с использованием другой даты привязки, нежели «19000101 00: 00: 00.000» (0 в вышеприведенных выражениях).
В секундудумал, что вы получите только 24+ дня миллисекунд в длинную подпись:
SELECT DateAdd(Millisecond, 2147483647, 0) = '1900-01-25 20:31:23.647'