Следующее решение использует DATEDIFF
с MINUTE
против смещения 00:02
, чтобы сначала скорректировать разницу, затем сокращает время до 30-минутных интервалов, используя минуты как целые числа и выполняя / 30 * 30
и, наконец, преобразовать результат обратно в TIME
.
DECLARE @Times TABLE (ClockTime TIME)
INSERT INTO @Times (ClockTime)
VALUES
('08:57'),
('08:58'),
('08:59'),
('09:00'),
('09:01'),
('09:02'),
('09:03'),
('09:05'),
('09:31'),
('09:31:59'),
('09:32'),
('10:32'),
('23:02'),
('23:03'),
('23:31:15')
SELECT
T.ClockTime,
MinutesMinus2 = DATEDIFF(MINUTE, '00:02', T.ClockTime),
MinutesMinus2On30Intervals = DATEDIFF(MINUTE, '00:02', T.ClockTime) / 30 * 30,
MinutesMinus2On30IntervalsAsTime = CONVERT(
TIME,
DATEADD(
MINUTE,
DATEDIFF(MINUTE, '00:02', T.ClockTime) / 30 * 30, -- MinutesMinus2On30Intervals
0))
FROM
@Times AS T
Результаты:
+------------------+---------------+----------------------------+----------------------------------+
| ClockTime | MinutesMinus2 | MinutesMinus2On30Intervals | MinutesMinus2On30IntervalsAsTime |
+------------------+---------------+----------------------------+----------------------------------+
| 08:57:00.0000000 | 535 | 510 | 08:30:00.0000000 |
| 08:58:00.0000000 | 536 | 510 | 08:30:00.0000000 |
| 08:59:00.0000000 | 537 | 510 | 08:30:00.0000000 |
| 09:00:00.0000000 | 538 | 510 | 08:30:00.0000000 |
| 09:01:00.0000000 | 539 | 510 | 08:30:00.0000000 |
| 09:02:00.0000000 | 540 | 540 | 09:00:00.0000000 |
| 09:03:00.0000000 | 541 | 540 | 09:00:00.0000000 |
| 09:05:00.0000000 | 543 | 540 | 09:00:00.0000000 |
| 09:31:00.0000000 | 569 | 540 | 09:00:00.0000000 |
| 09:31:59.0000000 | 569 | 540 | 09:00:00.0000000 |
| 09:32:00.0000000 | 570 | 570 | 09:30:00.0000000 |
| 10:32:00.0000000 | 630 | 630 | 10:30:00.0000000 |
| 23:02:00.0000000 | 1380 | 1380 | 23:00:00.0000000 |
| 23:03:00.0000000 | 1381 | 1380 | 23:00:00.0000000 |
| 23:31:15.0000000 | 1409 | 1380 | 23:00:00.0000000 |
+------------------+---------------+----------------------------+----------------------------------+
Вы также можете параметризовать смещение с помощью переменной TIME
на ваше время.изменения смещения:
DECLARE @TimeOffset TIME = '00:02'
SELECT
Interval = CONVERT(
TIME,
DATEADD(
MINUTE,
DATEDIFF(MINUTE, @TimeOffset, T.ClockTime) / 30 * 30,
0))
FROM
@Times AS T