截断时间戳

时间:2020-02-12 07:17:36

标签: sql sql-server

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

例如,如果我的输入值为2020-02-12 06:56:002020-02-12 07:14:00,我想在2020-02-12 06:00:002020-02-12 08:00:00中进行转换

强制转换功能可以工作吗?

3 个答案:

答案 0 :(得分:2)

您可以从所需的原始日期时间部分中构造新的日期时间。

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

答案 1 :(得分:1)

使用一些算术计算,将其转换为带小数的小时,然后使用floor()ceiling()进行向上/向下取整

首先,它发现与00:00:00不同的时间是秒。 convert(date, date_col)将日期时间转换为日期,因此实际上是00:00:00

datediff(second, convert(date, date_col), date_col)

然后您除以60 x 60 = 3600秒。给你几分之一小时

然后您使用floor()ceiling()进行四舍五入

最后将其添加回日期(convert(date, date_col)

最终查询

select  *,
        RoundDown   = convert(datetime, convert(date, date_col)) 
        + dateadd(hour, floor(datediff(second, convert(date, date_col), date_col) / (3600.0)), 0),
        RoundUp     = convert(datetime, convert(date, date_col))
        + dateadd(hour, ceiling(datediff(second, convert(date, date_col), date_col) / (3600.0)), 0)

from    (
            values 
            ('2020-02-12 06:56:00'),
            ('2020-02-12 07:14:00')
        ) d (date_col)

/*
2020-02-12 06:56:00 2020-02-12 06:00:00 2020-02-12 07:00:00
2020-02-12 07:14:00 2020-02-12 07:00:00 2020-02-12 08:00:00
*/

编辑:下面一个简单得多的查询

minute中除以60.0分钟,以小时(带小数位)为单位,然后应用floorceiling。最后将结果加回去

select  getdate() as Now, 
        dateadd(hour, floor(datediff(minute, 0, getdate()) / 60.0), 0) as RoundDown,
        dateadd(hour, ceiling(datediff(minute, 0, getdate()) / 60.0), 0) as RoundUp

答案 2 :(得分:1)

这是一个更简单的解决方案:

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,
       dateadd(hour, datediff(hour, 0, @start), 0) as TruncatedStart, 
       dateadd(hour, datediff(hour, 0, dateadd(hour, 1, @end)), 0) as TruncatedEnd

在两种情况下,该函数都会从原始时间戳中减去小时部分。对于TruncatedEnd,添加了一个小时,因此结果是随后的一个小时。