2015-12-28 30 views
0

您好我有一個天氣數據庫在SQL Server 2008中充滿了每20分鐘的天氣觀測。我想每隔20分鐘就得到一個小時的天氣記錄,我怎麼能過濾掉一些結果,因此只有結果中每小時的第一個觀察值。SQL按小時獲取數據

例子:

7:00:00 
7:20:00 
7:40:00 
8:00:00 

所需的輸出

7:00:00 
8:00:00 
+1

是否每隔一小時有20分鐘的每個增量行,還是有什麼差距? –

+0

應用這樣的WHERE條件:'WHERE datepart(minute,hour_column)= '。在你的情況下,每小時將是00。 –

回答

1

爲了得到準確(少的事實,這是一個INT而不是TIME;沒有什麼很難解決)你列出你想要的結果,

SELECT DISTINCT DATEPART(HOUR, TimeStamp) 
FROM Observations 

你也可以添加在CAST(TimeStamp AS DATE)如果你想要一個以及。


假設你想要的數據爲好,但是,這取決於一點點,但正是你所描述的東西,簡單的解決方案只是說:

SELECT * 
FROM Observations 
WHERE DATEPART(MINUTE, TimeStamp) = 0 

失敗,如果你缺少數據,但這很常見。


如果你有你想要的數據,但在沒有排幾個小時:00,你可以做這樣的事情:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CAST(TimeStamp AS DATE), DATEPART(HOUR, TimeStamp) ORDER BY TimeStamp) 
    FROM Observations 
) 

SELECT * 
FROM cte 
WHERE n = 1 

那將佔據第一位的任何日期/時間組合。

當然,如果你在整整一個小時內沒有數據,你仍然沒有留下任何東西。這將需要一個數字表,如果你甚至想要返回這些實例。

0

您可以使用一個公式類似以下獲得的時間點最接近的小時(在這種情況下,它是GETUTCDATE())。

SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETUTCDATE())/60 * 60, 0) 

然後你可以用這個公式您的SQL查詢的WHERE子句中得到你想要的數據。

0

您需要的是GROUP BY您想要的時間範圍,如日期和時間。然後,您將獲得時間範圍內的MIN值。既然你沒有指定你正在使用哪一列,這是我能給出的最通用的東西。

0

用作過濾器:

... where DATEPART(MINUTE, DateColumn) = 0 
0

過濾結果爲每整整一個小時,你可以設置你的where子句檢查00分鐘因爲每一個整點報時是HH:00:00。

要從時間戳中獲得分鐘部分,可以使用DATEPART功能。在日期部分功能

SELECT * 
FROM YOURTABLENAME 
WHERE DATEPART(MINUTE, YOURDATEFIELDNAME) = 0 

更多信息可以在這裏找到:http://www.w3schools.com/sql/func_datepart.asp