2014-11-14 57 views
2

我希望标题或多或少都是好的,不知道如何描述我的问题。在查询上创建“虚拟”数据?

我想要做的是创建日期是到日期,用户可以选择之间的一个时间序列,而不实际保存日期的表。比方说,这是2014年11月15日和2014年11月16日,我想有一个查询,让我:

[date] 
11-15-2014 00:00 
11-15-2014 01:00 
11-15-2014 02:00 
.. 
11-15-2014 23:00 

有什么办法来创建一个查询的日期(可能含有开始日期表)只要?

我thougt关于类似

SELECT Dateadd('h', i, t1.start_date) as date FROM t1 

,然后一些部分说“我”是零,则DateDiff(“H”,日期,结束日期)

我知道这将是容易的,如果之间在那里临时变量availabe,不幸的是不是在MS Access的情况。

现在我正在使用一种解决方法,在那里我有一个表格,其中包含每个小时的日期值几年,以及我在哪里使用LEFT JOIN ... WHERE日期BETWEEN,但我不喜欢这样“脏”的把戏很多。

在此先感谢!

+1

你的“脏”诀窍是actualy很正常的,很好的解决方案。几个小时,你可以使用不单一的,但另外两个表 - 第一个每天一个记录和另一个表中的24个记录(每个小时)。 – Arvo

+0

好的,我明白了:)谢谢。 – frrrt

回答

0

有一种方法可以做到这一点,但也有点“脏”:

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运行,就会产生无光盘访问可言,所以将是相当快的,且并不影响其做盘需要访问其他任何的查询。

我不一定会推荐这个。我只是注意到这是可能的。

+2

你的语法不适用于MS Access(注意由OP标签),尽管一般想法是可实现的。那么,对于大时间跨度(多年以上),我认为MS Access查询引擎无论如何都会失败。 – Arvo

+0

我没有注意到Access标签。而且在几天或几周内我不会推荐这种方法。 –