基本上,我想查詢,將在過去24小時內有一排爲每小時產生的結果:如何爲過去24小時的每一行製作臨時表?
01/01/2011 00:00:00 01/01/2011 01:00:00 01/01/2011 02:00:00 ...
任何方式我可以做到這一點,沒有遊標和臨時表?
基本上,我想查詢,將在過去24小時內有一排爲每小時產生的結果:如何爲過去24小時的每一行製作臨時表?
01/01/2011 00:00:00 01/01/2011 01:00:00 01/01/2011 02:00:00 ...
任何方式我可以做到這一點,沒有遊標和臨時表?
每一行對應一個小時給定日期(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
下面是簡單的方法...
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.
在一個特定的平臺或解決特定問題有可能是一個更好的辦法,但你將不得不放棄更多的細節得到這個問題的答案。
嗯... 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
一排每個小時是否'ROW_NUMBER()''從開始0'? –
+1直接使用(無證)spt_values。我知道我在過去的某個地方做過這樣的事情,但我能記得如何或在哪裏? 「type ='P'」位是關鍵。 –