oracle 中有一个表 srm_price 存在 start_date 和 end_date 两个日期范围字段,查找全部存在日期交叉的记录的sql怎么写
时间: 2024-10-09 20:14:17 浏览: 30
srm.zip_SRM_SRM segmentation_image segmentation_segmentation ima
在Oracle中,要找出`srm_price`表中两个日期范围(`start_date`和`end_date`)存在交集的所有记录,可以使用`INTERSECT`或`MINUS`操作符。这里假设`start_date`小于`end_date`。你可以尝试以下SQL查询:
```sql
-- 使用 INTERSECT 来找到有交集的记录
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date < '2099-12-31' AND end_date > SYSDATE
) AS t1
INTERSECT
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date > SYSDATE - INTERVAL '1' DAY AND end_date <= '2099-12-31'
) AS t2;
-- 使用 MINUS 可能会有遗漏,因为它只返回t1中有而t2中无的数据,所以需要反向查询
-- 如果需要完整结果,可能需要结合使用
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date < '2099-12-31' AND end_date > SYSDATE
) AS t1
MINUS
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date > SYSDATE - INTERVAL '1' DAY AND end_date <= '2099-12-31'
) AS t2;
```
这个查询首先选择出所有`start_date`小于等于当前日期并且`end_date`大于当前日期的记录(t1),然后选择出所有`start_date`大于当前日期减一天并且`end_date`小于等于当前日期的记录(t2)。通过`INTERSECT`操作,我们得到的是这两个集合都存在的记录。
请注意,这里的日期边界是硬编码的,你需要根据实际需求调整它们。此外,这个查询可能会受到系统时间的限制,如果你的数据跨越了很多年,可能需要更复杂的处理。
阅读全文