在查询中创建“虚拟”数据?

时间:2014-11-14 10:46:39

标签: sql ms-access

我希望标题或多或少好,不知道如何描述我的问题。

我想要做的是创建一个日期时间序列,这些日期介于用户可以选择的日期之间,而不是实际将日期保存到表中。假设它是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

有没有办法用查询创建这些日期(可能只包含开始日期的表格)?

我想知道像

这样的事情
SELECT Dateadd('h', i, t1.start_date) as date FROM t1

然后某些部分说“i”将介于0和DateDiff之间('h',start_date,end_date)

我知道如果临时变量可用,这将很容易,但不幸的是MS Access不是这样。

现在我正在使用一种解决方法,其中我有一个表格,其中包含几年内每小时的日期值,我在哪里使用LEFT JOIN ... WHERE date BETWEEN,但我不喜欢这个“肮脏的“伎俩。

提前致谢!

1 个答案:

答案 0 :(得分: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的一些资源,但它根本不会产生光盘访问,因此速度相当快,不会影响任何其他需要光盘访问的查询。

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