我有一些日期范围的数据表。当用户选择开始日期和结束日期,然后结果集将像所有的日期范围之间的2个日期,也所有失踪的日期范围之间的2个日期。
例如:
日期范围表
ID| fromdate | todate |
----------------------------
1 | 5-May-21 | 10-May-21 |
2 | 17-May-21 | 25-May-21 |
这是我主表,我在下面提到了我想要的所有结果集
如果用户选择:2021年5月5日至2021年5月25日**
预期结果:
ID| fromdate | todate |
----------------------------
1 | 5-May-21 | 10-May-21 |
0 | 11-May-21 | 16-May-21 |
2 | 17-May-21 | 25-May-21 |
如果用户选择:2021年5月6日至2021年5月23日**
预期结果:
ID| fromdate | todate |
-----------------------------
1 | 6-May-21 | 10-May-21 |
0 | 11-May-21 | 16-May-21 |
2 | 17-May-21 | 23-May-21 |
如果用户选择:2021年5月1日至2021年5月28日**
预期结果:
ID| fromdate | todate |
----------------------------
1 | 1-May-21 | 4-May-21 |
1 | 5-May-21 | 10-May-21 |
0 | 11-May-21 | 16-May-21 |
2 | 17-May-21 | 25-May-21 |
2 | 26-May-21 | 28-May-21 |
这里有些问题不是为了相似而试图发现的:
SQL Find missing date ranges
SQL how to write a query that return missing date ranges?
先谢谢你。
2条答案
按热度按时间lnlaulya1#
注意,我 * 假设 * 最终预期结果的预期结果是错误的,因为它与其他2个结果不匹配。最后一个集合的预期结果中的最后一行和第一行的
ID
值都不是0
,但是没有给出 * 为什么 * 它们这样做的解释。因此,我 * 假设 * 值应该是0
,就像“中间”的行一样。为此,我使用Tally来获取所需日期范围内的所有日期; Tally被限制为1,000行,比3年少一点,但是如果需要更多行,可以交叉连接到
N
。然后,我使用该计数创建一个内联日历表。接下来,我将该日历LEFT JOIN
到您的数据中,并使用gaps和island方法将值放入组中。最后,我对这些组进行聚合,获取每个文件中的MIN
和MAX
日期:db<>fiddle
ymdaylpp2#
您可以使用
union all
执行以下操作:Here是一个db〈〉小提琴。