【发布时间】:2018-05-16 22:40:35
【问题描述】:
我在 SQL 数据库中有需要扩展的 startDate 和 endDate 记录。
| userName | startDate | endDate | weekDay |
| :---------: | :--------: | :--------: | :-----: |
| Test User 1 | 2011-03-30 | 2011-04-05 | 1 |
| Test User 2 | 2016-10-05 | 2016-10-07 | 5 |
| Test User 3 | 2018-05-22 | 2018-05-26 | 4 |
在上表中,每条记录都包含涵盖多个日期的信息。我需要的是每个用户每个一个日期一个记录。我正在寻找的一个例子:
| userName | startDate | weekDay |
| :---------: | :--------: | :--------: |
| Test User 1 | 2011-03-30 | 1 |
| Test User 1 | 2011-03-31 | 1 |
| Test User 1 | 2011-04-01 | 1 |
| Test User 1 | 2011-04-02 | 1 |
| Test User 1 | 2011-04-03 | 1 |
| Test User 1 | 2011-04-04 | 1 |
| Test User 1 | 2011-04-05 | 1 |
| Test User 2 | 2016-10-05 | 5 |
| Test User 2 | 2016-10-06 | 5 |
| Test User 2 | 2016-10-07 | 5 |
| Test User 3 | 2018-05-22 | 4 |
| Test User 3 | 2018-05-23 | 4 |
| Test User 3 | 2018-05-24 | 4 |
| Test User 3 | 2018-05-25 | 4 |
| Test User 3 | 2018-05-26 | 4 |
This answer 让我更进一步,指定如何在 SQL 中生成日期序列。如何在 SQL 中根据开始和结束日期复制表格记录?
请注意,我需要这个解决方案同时在 MSSQL 和 PostgreSQL 中工作。
【问题讨论】:
-
您可能想看看 MS SQL 的这个问题:Custom SQL Calendar
-
谢谢,这些很有帮助。您链接的第二个问题中的
cross join很有趣,它可以在这里工作,但是每一行都需要与一组不同的日期交叉连接。所以我想我理解它的逻辑,但我很难过的是每一行都需要重复不同的次数,并且在不同的日期......我能想到的唯一方法是循环遍历每条记录,定义一个startDate和endDate,然后加入一个日期序列表,但我也认为必须有更好/更有效的方法来做到这一点.. -
假设你有一个列出所有相关日期的日历表——无论如何你可能应该这样做——这是一个简单的
PERIODS_TABLE p JOIN CALENDAR c ON c.date BETWEEN p.startDate AND p.endDate -
@tsouchlarakis:是的,交叉连接不会根据您的需要为您提供准确的重复数。它将为每个提供相同的内容,并且在每种情况下,重复的行都比您需要的要多得多。但这不是问题,因为您只需通过添加一个条件过滤掉不需要的重复项,该条件将测试日历表日期是否在您的开始日期和结束日期之间(如 Nockolay 所示)。在某些情况下,引入循环可能更有效,但通常比使用日历表更糟糕。这就是日历表如此普遍的原因。
标签: sql sql-server postgresql date-range