【问题标题】:MySQL - expanding a date range into individual datesMySQL - 将日期范围扩展到单个日期
【发布时间】:2018-07-30 05:01:38
【问题描述】:

我有一张表,上面有开始日期和重复次数(简化):

CREATE TABLE tblSchedule (
  schedStart timestamp,
  schedRepeatMonth tinyint,
  schedRepeatDays  tinyint,
  schedOpen bit
);

因此,在一个简化的示例中,“每周二开放”的开始日期为周二,每 7 天重复一次。第三个星期五将从星期五开始,每月 21 天重复一次。圣诞节关门的日期为 12 月 25 日,不重复,关门。

它必须处理两种类型的查询 - “我们在这个日期是否营业”和“我们在这些日期之间营业多少次”。如果表格中没有重复填充,这些将是完全普通的查询,我想做的是创建一个选择来生成行就好像它们已经被长期输入而不重复,即:

SELECT * from (
    SELECT schedStart, schedEnd from tblSchedule
     where schedStart between ('2001-01-01', '2001-12-31')
     and *expand_ranges_into_non_repeating_rows_here*)
)

问题在于 SQL 是关于过滤信息,而不是扩展信息,因此从单个行创建多行并不完全正常。我可以使用一个 while 循环来创建一个临时表,但这是整个系统中多个项目的时间表,因此它通常会运行很多,尽管某些日期范围比其他日期范围更常见.

有什么想法吗?如果我们可以将解决方案尽可能保持为标准 sql,则将获得奖励。

编辑: 我想这个问题可以进一步简化和抽象为“如何在不使用表格的情况下创建一系列行。”

【问题讨论】:

标签: mysql sql date


【解决方案1】:

嗯。我想我撤回了这个问题。我已经尝试过递归视图,其中一些可能使用 MySQL 的新 cte 功能,但所涉及的计算变得太耗时(例如,以星期为模使索引无用)。我决定在运行开始时将它们扩展为一个临时表。

我会删除这个问题,但我认为失败的尝试与成功的尝试一样有用。如果有人想继续讨论,请随意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多