有一种方法可以做到这一点,但也有点“脏”:
select d.BaseDay, h.Hour, DateAdd(HH, h.Hour, d.BaseDay)
from
(
select convert(datetime, '15 Nov 2014') BaseDay
union select dateadd(D, 1, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 2, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 3, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 4, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 5, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 6, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 7, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 8, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 9, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 10, convert(datetime, '15 Nov 2014'))
union select dateadd(D, 11, convert(datetime, '15 Nov 2014'))
-- continue for as many days as you want
-- to cover the max period you'll want
) d
cross join
(
select 0 Hour
union select 1
union select 2
union select 3
union select 4
union select 5
union select 6
-- continuing up to hour 23 excluded for brevity
) h
where d.BaseDay < '16 Nov 2014'
两个硬编码的日期将在适当的执行参数(@startDate和@EndDate)。
两个缺点: 开始日期和结束日期之间的天数限于许多人可以忍受的打字次数(在这种情况下为11),并且时钟更改天根本不会被照顾。
优势一:尽管这将需要一些资源从SQL Server运行,就会产生无光盘访问可言,所以将是相当快的,且并不影响其做盘需要访问其他任何的查询。
我不一定会推荐这个。我只是注意到这是可能的。
你的“脏”诀窍是actualy很正常的,很好的解决方案。几个小时,你可以使用不单一的,但另外两个表 - 第一个每天一个记录和另一个表中的24个记录(每个小时)。 – Arvo
好的,我明白了:)谢谢。 – frrrt