此问题已在此处有答案:
Oracle SQL. Get Dates between two dates(3个答案)
Generate a range of dates using SQL(17回答)
2天前关闭。
社区在2天前审查了是否重新打开此问题,并将其关闭:
原始关闭原因未解决
我有一个表create table date_period(dt_from date, dt_to date);
,我想生成1列输出,每2个日期之间的日期。
我这样写道:
select (dt_from - 1 + ROWNUM)
from date_period
connect by ROWNUM <= (trunc(dt_to) - trunc(dt_from) + 1)
但由于某些原因,它不能正常工作,它只在date_period
表中只有1行时才有效。
我错在哪里?我该怎么解决这个问题?
例如,如果我的表中有两行:
13-FEB-2023, 15-FEB-2023
20-JUN-2023, 22-JUN-2023
我想把这个退回去:
13-FEB-2023
14-FEB-2023
15-FEB-2023
20-JUN-2023
21-JUN-2023
22-JUN-2023
但是通过我写的查询,我得到了这个:
13-FEB-23
14-FEB-23
15-FEB-23
23-JUN-23
我可以使用递归公共表表达式来实现这一点,但是如何使用connect by来实现呢?
1条答案
按热度按时间hi3rlvi21#
您需要在查询中使用
PRIOR dt_from = dt_from
,以确保生成的日期被视为行。如果不这样做,查询将在最后一个实际数据行处停止。AND PRIOR SYS_GUID() IS NOT NULL
的引入是为了避免创建笛卡尔积。一种更“现代”和符合SQL标准的方法是采用“递归CTE”,而不是Oracle的专有语法。例如
fiddle
注意事项
我看不到任何东西可以阻止您的日期范围重叠,因此输出将重复日期。因此,为了避免这种情况,您可能需要在上述查询中采用
SELECT DISTINCT
。fiddle with duplicates