2011-10-05 68 views

回答

2

每一行對應一個小時給定日期(SQL Server解決方案)。

select dateadd(hour, Number, '20110101') 
from master..spt_values 
where type = 'P' and 
     number between 0 and 23 

結果與過去24小時

select dateadd(hour, datediff(hour, 0, getdate()) - number, 0) 
from master..spt_values 
where type = 'P' and 
     number between 0 and 23 
+0

+1直接使用(無證)spt_values。我知道我在過去的某個地方做過這樣的事情,但我能記得如何或在哪裏? 「type ='P'」位是關鍵。 –

1

下面是簡單的方法...

SELECT '01/01/2011 00:00:00' as [hour], blah, blah2 
UNION ALL 
SELECT '01/01/2011 01:00:00' as [hour], blah, blah2 
UNION ALL 
SELECT '01/01/2011 02:00:00' as [hour], blah, blah2 
UNION ALL 
...etc 24 times. 

在一個特定的平臺或解決特定問題有可能是一個更好的辦法,但你將不得不放棄更多的細節得到這個問題的答案。

3

嗯... SQL服務器,你可以做到這一點...

WITH cte 
AS 
(
    SELECT CAST('1-jan-2011' AS DATETIME) AS 'date' 
    UNION ALL 
    SELECT DATEADD(hh, 1, [date]) FROM cte WHERE [date] < '1-jan-2011 23:00' 
) 
SELECT [date] FROM cte 

...但在現實中,只有小時(0〜23)表會比較有用的,因爲你可以在任何日期添加小時。

WITH cte 
AS 
(
    SELECT 0 as 'Hour' 
    UNION ALL 
    SELECT hour + 1 FROM cte WHERE hour < 23 
) 
SELECT DateAdd(hh, hour, '1-jan-2010') FROM cte 

另外,稍微構(isoteric)的方法是使用ROW_NUMBER排序函數對一些abitrary對象的第24行(如spt_values)...

WITH cte AS 
(
    SELECT n 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY type) FROM master..spt_values) D (n) 
    WHERE n < 24 
) 
SELECT dateadd(hh,n,'01-jan-2011') FROM cte 
+0

一排每個小時是否'ROW_NUMBER()''從開始0'? –

相關問題