将最近时间值转换为精确小时数

时间:2017-02-16 09:48:27

标签: sql sql-server time

我有一个有小时级别记录的表,但它们不是24小时,如下午1点,下午2点等等。相反,我有超过24个数据点,如2:18,2:38,3: 10,3:45等等。

在我的最终数据集中,我只想要24个精确小时的数据点,我计划将数据点最接近未来一小时作为精确小时,然后删除其他小时。请参阅附图以获得清晰参考。

原始数据集:

enter image description here

而我希望最终的数据集像

最终期待:

enter image description here

所以,基本上我可能有一个小时范围的多个数据点,我必须设置最接近的一个与下一个确切的小时,并删除其他。

任何领导都应该采取什么方法。任何实现相同的方法?

2 个答案:

答案 0 :(得分:0)

也许存在另一种归档方法,但我的如下: -

  • 使用dateadd功能添加额外的分钟数,以便到达下一个小时。

  • 使用Where子句通过Min仅选择所需的输出 功能

<强>演示: -

DDL&amp; DML

Create table Test (
                    [Date] date , 
                    [time] time(7), 
                    col1 char (1),
                    col2 char (1) , 
                    col3 char(1)
                )
go
insert into Test values ('02/02/2017' , '1:15' , 'a' , 'b' , 'c')
insert into Test values ('02/02/2017' , '1:35' , 'w' , 'e' , 'r')
insert into Test values ('02/02/2017' , '2:16' , 'q' , 'w' , 'e')
insert into Test values ('02/02/2017' , '3:48' , 'z' , 'x' , 'c')
insert into Test values ('02/02/2017' , '3:58' , 'b' , 'n' , 'm')
go
select * from Test

结果: -

enter image description here

查询

select [Date] , 
        dateadd(minute,abs(datepart(minute,[time]) - 60),[time]) as [time],
        col1 , col2 , col3
from test
where 
    datepart(hour,[time]) 
in
(
    select 
    datepart(hour,[time]) 
    from Test
    group by datepart(hour,[time]) 

)
AND 
    abs(datepart(minute,[time]) - 60)
in 
(
    select 
    min(abs(datepart(minute,[time]) - 60)) 
    from Test
    group by datepart(hour,[time]) 
)

结果: -

enter image description here

答案 1 :(得分:0)

一种选择是使用CTEROW_NUMBERDATEADD来获得下一轮时间:

;WITH CTE AS
(
    SELECT [Date],
           DATEADD(MINUTE, 60 - DATEPART(MINUTE, [time]), [time]) [Time],
           col1,
           col2,
           col3,
           ROW_NUMBER() OVER(PARTITION BY DATEPART(HOUR, [time]) ORDER BY Date, Time DESC) rn
    FROM Test
)

SELECT CASE WHEN [Time] = '00:00:00' THEN DATEADD(DAY, 1, [Date]) ELSE [Date] END [Date],
       [Time],
       col1,
       col2,
       col3
FROM CTE
WHERE rn = 1

结果:

Date            Time        col1    col2    col3
02.02.2017      02:00:00    w       e       r
02.02.2017      03:00:00    q       w       e
02.02.2017      04:00:00    b       n       m