Oracle 使用分层查询获取两个日期之间的天数

Oracle 使用分层查询获取两个日期之间的天数,oracle,Oracle,我想在两个给定日期之间生成天数,因此我找到了以下使用分层查询的方法: select CONTACT_ID, S_DATE, E_DATE, trunc(S_DATE)+level-1 dt from CONTACTS connect by trunc(S_DATE)+level-1<=trunc(E_DATE) and prior dbms_random.value is not null and prior CONTACTS.CONTACT

我想在两个给定日期之间生成天数,因此我找到了以下使用分层查询的方法:

select CONTACT_ID, S_DATE, E_DATE, trunc(S_DATE)+level-1 dt
       from CONTACTS
        connect by trunc(S_DATE)+level-1<=trunc(E_DATE) 
        and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID;
因此,如果我有以下行:

1,2016-01-01 23:00:00,2016-01-02 05:00:00

上述查询将生成以下输出:

2016-01-01 23:00:00,2016-01-02 05:00:00,2016-01-01 00:00:00

2016-01-01 23:00:00,2016-01-02 05:00:00,2016-01-02 00:00:00

但是我不理解查询是如何工作的,尤其是这一部分:和previor dbms_random.value不为null和previor CONTACTS.CONTACT_ID=CONTACTS.CONTACT_ID

谁能给我解释一下吗?

你可以用它得到同样的结果,在我看来这更直观

with data(CONTACT_ID, S_DATE, E_DATE, DT) as (
    select CONTACT_ID, S_DATE, E_DATE, S_DATE  from CONTACTS
    union all
    select CONTACT_ID, S_DATE, E_DATE, DT+1 from data where DT+1  <= E_DATE
)
select CONTACT_ID, S_DATE, E_DATE, DT
from data
子查询中的第一个选择定义了初始条件,即在第4列中以S_日期开始

重复执行的第二个选择定义了步骤DT+1,WHERE子句定义了终止条件

递归子查询分解是一种AIK标准,在

中介绍,我认为它解释得很好。