2017-02-16 48 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

只需添加一個案例。我編輯了我的答案以包含它。 –