【发布时间】: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,则将获得奖励。
编辑: 我想这个问题可以进一步简化和抽象为“如何在不使用表格的情况下创建一系列行。”
【问题讨论】:
-
如果您在 Google 上搜索
recurring events SQL或类似问题,SO 上已经有很多类似的问题。其中之一可能会对您有所帮助。例如。 stackoverflow.com/questions/14230380/…, stackoverflow.com/questions/9277834/recurring-events-sql-query -
无论是否发生单个重复事件,这两个(以及我发现的所有)都会返回,而不是发生多少次,同样重要的是,何时发生。我试图解决的是将单个重复行扩展为查询中的多个单次事件(即不与实际的物理表连接)。不过,确实给了我一些思考的余地。