【发布时间】:2021-09-30 01:10:49
【问题描述】:
我将时间存储为 int,如下面的时间列所示。
我可以使用已定义的函数转换为日期时间或秒数,但我需要在舍入到 30 分钟后对其求和。
-----------------------------------------------------------------
Time | datetime | desired output as datetime
-----------------------------------------------------------------
11600 | 2021-05-05 01:16:00.000 | 2021-05-05 01:30:00.000
200 | 2021-05-19 00:02:00.000 | 2021-05-19 00:30:00.000
100 | 2021-05-10 00:01:00.000 | 2021-05-10 00:30:00.000
23000 | 2021-05-21 02:30:00.000 | 2021-05-21 02:30:00.000
-----------------------------------------------------------------
到目前为止,我管理的是将 int 转换为 datetime,然后在条件上舍入到 30 分钟(上面的所需输出列),但我仍然需要对其求和,不能这样:
;with t as(
SELECT
[dbo].[sys_time_from_int](DATE,TIME_AWAY) DATE_AUX
FROM [time_sheet] x1
)
SELECT
CASE
WHEN datepart(MINUTE, DATE_AUX) = 30 or datepart(MINUTE, DATE_AUX) = 00
THEN DATEADD( minute, ( DATEDIFF( minute, 0, DATEADD( second, ( 30 * 60 ) / 2, DATE_AUX) ) / 30 ) * 30, 0 )
ELSE DATEADD( minute, ( DATEDIFF( minute, 0, DATEADD( minute, 30 , DATE_AUX) ) / 30 ) * 30, 0 )
end as TIME_AUX
from t
看到的函数采用 (2021-05-05, 11600) 并将其转换为日期时间。 我也可以使用c#。 任何提示将不胜感激。
【问题讨论】:
-
这能回答你的问题吗? How can I round up the time to the nearest X minutes? 它是 C# 但非常方便的扩展,因此您可以四舍五入到您想要的任何原子性。移植到 SQL 应该不是问题,因为这是严格的数学运算。
-
我认为 C# 更容易;将其加载为时间跨度并将其处理为
TimeSpan.FromMinutes(Math.Round(timespanfromdb.TotalMinutes/30)*30)
标签: c# sql-server datetime rounding