2012-09-27 103 views
0

SQL Server 2008的SQL Server分解日期时间的日 - 小时查询?

declare @pardate table (pardateid int, pardatewhen datetime2(3)) 
insert into @pardate values (1 , '2011-09-17 12:43') 
insert into @pardate values (2 , '2011-09-17 12:44') 
insert into @pardate values (3 , '2011-10-11 12:45') 
insert into @pardate values (4 , '2011-10-12 12:46') 
insert into @pardate values (5 , '2011-10-13 12:47') 
insert into @pardate values (6 , '2011-11-20 12:48') 
insert into @pardate values (7 , '2011-11-21 12:49') 
insert into @pardate values (8 , '2011-11-22 12:50') 
declare @child table (childid int , pardateid int , childvalue char(6)) 
insert into @child values (1 , 1 , 'aaaaaa') 
insert into @child values (2 , 2 , 'bbbbbb') 
insert into @child values (3 , 3 , 'cccccc') 
insert into @child values (4 , 4 , 'dddddd') 
insert into @child values (5 , 5 , 'cccccc') 
insert into @child values (6 , 6 , 'cccccc') 
insert into @child values (7 , 7 , 'eeeeee') 
insert into @child values (8 , 8 , 'ffffff') 

select pardatewhen , childvalue , COUNT(childvalue) 
from @child childtable join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
group by pardatewhen , childvalue 

我试图让child.childvalue每一天每一个小时的@计数,所以就在我结果8760行。 第一遍有一个循环和一个CONVERT,它需要大约5分钟才能运行实际的结果集(这只是插图的一个示例)。我确实创建了一个CTE来制作一个日历临时表(使用http://www.sqlpointers.com/2006/07/generating-temporary-calendar-tables.html),并且认为它可以以某种方式加入“空值”到结果集中。

我需要得到一个结果集,看起来像这样

date   hour count 
... 
2011-09-17 0  0 
.... 
2011-09-17 12  2 
.... 
2011-10-11 12  1 

那怎么可以高效地完成?

谢谢。

回答

1

尝试。

;WITH cal AS 
(SELECT CAST('2011-01-01' AS DATETIME) AS cal_date 
    UNION ALL 
SELECT DATEADD(hour,1,cal_date) 
    FROM cal 
    WHERE cal_date < '2011-12-31 23:00' 
) 
, par AS 
(
    select CAST(pardatewhen AS DATE) AS pardate, DATEPART(hh,pardatewhen) AS parhour , COUNT(childvalue) as num 
    from @child childtable 
    join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
    group by CAST(pardatewhen AS DATE), DATEPART(hh,pardatewhen) 
) 
SELECT CAST(cal.cal_date AS DATE) AS [date],DATEPART(hh,cal.cal_date) AS [hour],ISNULL(par.num,0) AS [childvalue_count] 
FROM cal 
LEFT JOIN par 
    ON CAST(cal.cal_date AS DATE) = par.pardate 
     AND DATEPART(hh,cal.cal_date) = par.parhour 
OPTION (MAXRECURSION 9999) 
+0

@Snowy - 如果你需要处理超过9999小时设置'MAXRECURSION'为'0'消除递归的限制。 – HABO

1

喜欢的东西(有childvalue在你的查询,但不是在你的榜样结果呢?)

select Cast(pardatewhen as Date) as [date], DatePart(hour,pardatewhen) as [hour] , childvalue , COUNT(childvalue) 
from @child childtable 
join @pardate parenttable on childtable.pardateid=parenttable.pardateid 
group by Cast(pardatewhen as Date), DatePart(hour,pardatewhen), childvalue 

注记日期类型是SQL推出2008

+2

该OP要求计算“每天,每小时,所以在我的结果中会有8760行”。可能需要生成所有日期/小时的CTE。 – HABO

+0

啊我错过了。看起来像EricZ那里虽然 –