将 INT 转换为 TIME 并获取下一个小时或半小时的值

Convert INT to TIME and get next hour or half hour value

我正在使用以下查询将 INT 转换为时间。

DECLARE @TimeVal INT
SET @TimeVal = 115024
SELECT DATEADD(HOUR, (@TimeVal / 10000) % 100, 
       DATEADD(MINUTE, (@TimeVal / 100) % 100, 
       DATEADD(SECOND, (@TimeVal % 100), CAST('00:00:00' AS TIME(0)))))

它会给出结果11:50:24。然后我需要将这个时间值四舍五入到最近的小时或半小时值。这次输入的预期输出是 12:00:00.

示例输入和输出

11:15:12 -> 11:30:00
10:56:58 -> 11:00:00
22:01:59 -> 22:30:00

请试试这个,

DECLARE @TimeVal INT
SET @TimeVal = 111512
SELECT DATEADD(HOUR,case when (((@TimeVal / 100) % 100)>30 and ((@TimeVal / 10000) % 100)<24) then ((@TimeVal / 10000) % 100)+1 else (@TimeVal / 10000) % 100 end, 
DATEADD(MINUTE,case when ((@TimeVal / 100) % 100)>30 then 0 when ((@TimeVal / 100) % 100)<30 then 30 end,
 DATEADD(SECOND, 0, CAST('00:00:00' AS TIME(0)))))

我会将数字转换为仅使用秒数的时间:

   convert(time, dateadd(second, (@timeval / 10000) * 60 * 60  +  ((@timeval / 100) % 100) * 60 + @timeval % 100, 0))

然后,有多种方法可以进行舍入。我觉得case最简单:

(case when @timeval % 100 >= 30
      then convert(time, dateadd(second, (@timeval / 10000) * 60 * 60 + ((@timeval / 100) % 100) * 60 + 60, 0))
      then convert(time, dateadd(second, (@timeval / 10000) * 60 * 60 + ((@timeval / 100) % 100) * 60, 0))
 end)