首页 > 解决方案 > 截断时间戳

问题描述

我想进入一个存储过程,在最高小时或最低小时截断时间戳输入值。

例如,如果我的输入值为2020-02-12 06:56:00and 2020-02-12 07:14:00,我想将其转换为2020-02-12 06:00:00and2020-02-12 08:00:00

强制转换函数可以工作吗?

标签: sqlsql-server

解决方案


您可以从您想要的原始日期时间部分构建新的日期时间。

declare @start datetime = '2020-02-12 06:56:00'
declare @end datetime = '2020-02-12 07:14:00'

select @start as OriginalStart,
       @end as OriginalEnd,
       datetimefromparts(year(@start), month(@start), day(@start), datepart(hour, @start), 0, 0, 0) as TruncatedStart,
       dateadd(hour, 1, datetimefromparts(year(@end), month(@end), day(@end), datepart(hour, @end), 0, 0, 0)) as TruncatedEnd

间隔的第一个截断是较低的小时,第二个截断增加一个额外的小时,因此它返回较高的小时。

PS:如果您想要四舍五入到最接近的小时,那么您可以添加 30 分钟并截断:

declare @date datetime = '2020-02-12 06:56:00'

set @date = dateadd(minute, 30, @date)

select datetimefromparts(year(@date), month(@date), day(@date), datepart(hour, @date), 0, 0, 0) as NearestHour

或一步(使用 Lepetit 的截断快捷方式):

declare @date datetime = '2020-02-12 06:56:00'

select dateadd(hour, datediff(hour, 0, dateadd(minute, 30, @date)), 0) AS NearestHour

推荐阅读