【问题标题】:Create "virtual" data on query?在查询中创建“虚拟”数据?
【发布时间】:2014-11-14 10:46:38
【问题描述】:

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

我想做的是创建一个时间序列,这些日期介于用户可以选择的日期之间,而不是将日期实际保存到表格中。假设现在是 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,但我不喜欢这样“肮脏”的伎俩。

提前致谢!

【问题讨论】:

  • 您的“肮脏”技巧实际上是非常正常且很好的解决方案。在几个小时内,您可以使用两个额外的表,而不是单个表 - 第一个表中每天一条记录,另一个表中每天 24 条记录(每小时)。
  • 好的,我明白了:)谢谢。

标签: sql ms-access


【解决方案1】:

有办法做到这一点,但也有点“脏”:

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 的一些资源来运行,但它根本不会产生磁盘访问,因此会相当快,并且不会影响任何其他需要磁盘访问的查询。

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

【讨论】:

  • 您的语法在 MS Access 中不起作用(注意 OP 的标签),尽管总体思路是可以实现的。好吧,对于大的时间跨度(几年左右),我认为 MS Access 查询引擎无论如何都会因这样的联合而失败。
  • 我没有注意到 Access 标签。在超过几天或几周的时间里,我不会推荐这种方法。
猜你喜欢
  • 2018-11-29
  • 2023-03-16
  • 2022-11-10
  • 1970-01-01
  • 2015-05-19
  • 2020-01-11
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多