datetime2 截断到最后一个完整的 30 分钟时间段

问题描述

我正在尝试创建一个四舍五入到最后完成的 30 分钟时间段的函数。我对 30 分钟的定义是每小时半小时(12、12:30、13、13:30 等)

因此,如果时间为 22:16,我希望将其截断为 22:00,但是,如果时间为 22:48,我希望结果为 22:30

我已经测试过:

DECLARE @RUN_DATE datetime2(1) = GETDATE();
DECLARE @Rounded datetime2(1) = dateadd(hour,datediff(hour,dateadd(mi,@RUN_DATE)),0)

然而,这会将 22:38 舍入到 23:00

非常感谢任何提示:)

解决方法

您可以使用以下技巧

DECLARE @RUN_DATE datetime2(1) = GETDATE();
DECLARE @Rounded datetime2(1) = DATEADD(mi,DATEDIFF(mi,@RUN_DATE)/30*30,0)
select @rounded