2011-10-05 61 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'? –