将时间舍入到半小时间隔并求和
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)
我将时间存储为 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)