Буквальная интерпретация вашего вопроса:
select id,
InTime = DateAdd(mi,
case
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) = '00:00:00' then 0
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:15:00' then 15
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:45:00' then 30
else 60
end, DateAdd(hh, DATEDIFF(HH, 0, intime), 0)),
OutTime = DateAdd(mi,
case
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) = '00:00:00' then 0
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:15:00' then 15
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:45:00' then 30
else 60
end, DateAdd(hh, DATEDIFF(HH, 0, OutTime), 0))
from tbl
Но, учитывая ваш вывод, ваше третье правило должно было быть
Если количество минут больше [ИЛИ РАВНО ДО] 45 минут, тогда должно отображаться ровно 1 час, например 04: 00: 00
Таким образом, запрос становится
select id,
InTime = DateAdd(mi,
case
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) = '00:00:00' then 0
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) <= '00:15:00' then 15
when DateAdd(hh, -DATEDIFF(HH, 0, intime), intime) < '00:45:00' then 30
else 60
end, DateAdd(hh, DATEDIFF(HH, 0, intime), 0)),
OutTime = DateAdd(mi,
case
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) = '00:00:00' then 0
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) <= '00:15:00' then 15
when DateAdd(hh, -DATEDIFF(HH, 0, OutTime), OutTime) < '00:45:00' then 30
else 60
end, DateAdd(hh, DATEDIFF(HH, 0, OutTime), 0))
from tbl
RE ваш предыдущий вопрос
Вы приняли ответ в своем предыдущем вопросе , который всегда КРУГЛЫЙ ВНИЗ , когда был ответ, который округлился правильно? Неверное описание
Выше запроса, дающего результат в течение 30 минут или 1 часа, что означает, что минут меньше 30, тогда как отображается 30 минут
Это не так. select dateadd(mi, datediff(mi,0, '09:21')/30*30, 0)
возвращает 09:00
, округляя ВНИЗ.