将时间舍入到半小时间隔并求和

Round time to half hour intervals and sum it

我将时间存储为 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#。 任何提示将不胜感激。

看起来你正在积极地四舍五入(因此是 +29)。

也许这会有所帮助

例子

Declare @YourTable Table ([Time] int,[datetime] datetime)  
Insert Into @YourTable Values 
 (11600,'2021-05-05 01:16:00.000')
,(200,'2021-05-19 00:02:00.000')
,(100,'2021-05-10 00:01:00.000')
,(23000,'2021-05-21 02:30:00.000')
 
Select * 
      ,NewValue = dateadd(minute,((datediff(minute,0,[datetime])+29)  / 30) * 30,0)
 From @YourTable

结果

Time    datetime                    NewValue
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

使用聚合更新

 Select sum((datepart(hour,NewValue)*60) + datepart(minute,NewValue)) / 60.0
  From  @YourTable
  Cross Apply (values ( ( dateadd(minute,((datediff(minute,0,[datetime])+29)  / 30) * 30,0) ) ) ) b(NewValue)