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

时间:2016-01-02 14:07:15

标签: 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_ID = CONTACTS.CONTACT_ID;

所以,如果我有以下一行:

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

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

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

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

但我不明白查询的工作原理,尤其是这一部分:and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID

有人能解释一下吗?

1 个答案:

答案 0 :(得分:0)

您可以使用recursive subquery factoring来获得完全相同的结果,这在我看来更为直观。

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

子查询中的第一个选择定义了初始条件,即从S_DATE开始(在第4列中)。

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

递归子查询因子分解是AFAIK标准,并在11.2中引入