oracle 日期之间的重叠

9udxz4iz  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(104)

我需要帮助创建一个SELECT stmt来验证MY_TABLE行。
无效的MY_TABLE配置是指在同一个表中同时存在一个FLAG = 1的行和一个或多个FLAG = 0的行。这是MY_TABLE的无效配置:
| 产品说明|标志|日期_从|日期至| DATE_TO |
| --|--|--|--| ------------ |
| 第一排|一个|2023-07-20|空值| NULL |
| 第二排|0个|2023-07-21|空值| NULL |
| 第三排|0个|2023-07-22|空值| NULL |
好吧,这很简单。但有效配置是如果具有FLAG = 1的行的DATE_FROM和DATE_TO不与具有FLAG = 0的行重叠。因此,这是有效配置,因为“第一行”在2023-07-25结束,而“第二行”在2023-07-26开始,因此具有FLAG = 1的行的有效性不与具有FLAG = 0的行的有效性重叠:
| 产品说明|标志|日期_从|日期至| DATE_TO |
| --|--|--|--| ------------ |
| 第一排|一个|2023-07-20| 2023-07-25 2023-07-25 2023-07-25| 2023-07-25 |
| 第二排|0个|2023-07-26| 2023-07-30 - 2023-07-30| 2023-07-30 |
| 第三排|0个|2023-07-27|空值| NULL |
可以存在具有FLAG = 0的多个行,但仅存在具有FLAG = 1的1个行。如果DATE_TO为NULL,则意味着它在未来永远有效。对于FLAG = 0的行,如果DATE_FROM和DATE_TO重叠(仍然有效的配置),则没有问题。
是否可以使用SELECT语句检查MY_TABLE是否包含有效/无效的行?选择应返回“有效”/“无效”。我应该以某种方式在DATE_FROM和DATE_TO列上进行自联接吗?

gjmwrych

gjmwrych1#

您可以通过以下方式查找具有重叠历史记录(开始/结束日期行)日期的行:

SELECT *
  FROM mytable t1
 WHERE EXISTS (SELECT *
                 FROM mytable t2
                WHERE t2.date_from < t1.date_to
                  AND t2.date_to > t1.date_from
                  AND t2.rowid != t1.rowid)

字符串
显然,如果您有多个实体的历史记录(一个自然键),那么您需要在连接中包含键列。

相关问题