2017-02-16 22 views
0

我有一个表有小时级记录,但他们不是确切的24小时像下午1:00,下午2:00等,而是我有超过24个数据点,如2:18 ,2:38,3:10,3:45等等。转换最近的时间值到确切的小时

在我的最终数据集中,我只想要24小时的数据点,我准备将数据点最接近即将到来的小时,并删除其他小时。请参阅附件图像以获得清晰的参考

原始数据集:

enter image description here

,而我想最终的数据集,以像

最终期望:

enter image description here

所以,基本上我可能有多个数据指向一个小时的范围,我必须设置与下一个确切的小时和delet最近的一个其他。

任何方法,我应该采取的任何方法来实现相同?

+0

什么是时间列的数据类型,以及您使用的是哪个版本的sql server? –

+0

@ZoharPeled数据类型是时间(7),我正在使用SQL Server 2014 Management Studio(12。0) – user7409370

回答

0

也许还有用于存档此另一个办法,但我是如下: -

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

  • 使用Where子句仅通过使用Min 函数来选择期望的输出。

演示: -

DDL & 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

+0

谢谢你这个ahmed。它真的看起来很有帮助,并尝试利用我的情况相同。这里只提一点,这件作品会考虑到第23小时的估计最终会在第二天进行的事实。所以,日期需要相应更新。例如,2017年2月2日23:48的数据点需要估计到2017年3月2日00:00。所以,相应的日期需要更新。 – user7409370

0

一种选择是使用CTEROW_NUMBER,并DATEADD获得下一轮小时:

;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 
+0

谢谢ZOhar。它真的看起来很有帮助,并尝试利用我的情况相同。这里只提一点,这件作品会考虑到第23小时的估计最终会在第二天进行的事实。所以,日期需要相应更新。例如,2017年2月2日23:48的数据点需要估计到2017年3月2日00:00。所以,相应的日期需要更新 – user7409370

+0

只需添加一个案例。我编辑了我的答案以包含它。 –