gpt4 book ai didi

sql - ORACLE (11.2.0.1.0) - 带有日期表达式的递归 CTE

转载 作者:行者123 更新时间:2023-12-01 14:59:24 25 4
gpt4 key购买 nike

以下问题的正确答案:

  • 如果我没记错的话,这是在 11.2.0.3 或更高版本中修复的错误。 (无论如何不再支持 11.2.0.1。11.2.0.4 是唯一仍受支持的 11.2 版本) – @a_horse_with_no_name
  • Bug 编号为 11840579,已在 11.2.0.3 和 12.1.0.1 中修复
    – @a_horse_with_no_name

  • 问题

    我有一张 table
    CREATE TABLE test(
    from_date date,
    to_date date
    );

    INSERT INTO test(from_date,to_date)
    --VALUES('20171101','20171115');
    VALUES(TO_DATE('20171101','YYYYMMDD'),TO_DATE('20171115','YYYYMMDD'));

    Oracle 中的以下查询仅返回一行(预计 15 行)
    WITH dateCTE(from_date,to_date,d,i) AS(
    SELECT from_date,to_date,from_date AS d,1 AS i
    FROM test

    UNION ALL

    SELECT from_date,to_date,d+INTERVAL '1' DAY,i+1
    FROM dateCTE
    WHERE d<to_date
    )
    SELECT d,i
    FROM dateCTE

    SQL fiddle - http://sqlfiddle.com/#!4/36907/8

    为了测试,我将条件更改为 i<10
    WITH dateCTE(from_date,to_date,d,i) AS(
    SELECT from_date,to_date,from_date AS d,1 AS i
    FROM test

    UNION ALL

    SELECT from_date,to_date,d+INTERVAL '1' DAY,i+1
    FROM dateCTE
    --WHERE d<to_date
    WHERE i<10 -- exit condition
    )
    SELECT d,i
    FROM dateCTE

    并得到下一个结果
    | D          | I  |
    |------------|----|
    | 2017-11-01 | 1 |
    | 2017-10-31 | 2 |
    | 2017-10-30 | 3 |
    | 2017-10-29 | 4 |
    | 2017-10-28 | 5 |
    | 2017-10-27 | 6 |
    | 2017-10-26 | 7 |
    | 2017-10-25 | 8 |
    | 2017-10-24 | 9 |
    | 2017-10-23 | 10 |

    为什么这个递归查询在 Oracle 中返回了错误的结果?

    SQL fiddle - http://sqlfiddle.com/#!4/36907/5

    我在 SQLServer 中运行了一个类似的查询,得到了正确的结果
    WITH dateCTE(from_date,to_date,d,i) AS(
    SELECT from_date,to_date,from_date AS d,1 AS i
    FROM test

    UNION ALL

    SELECT from_date,to_date,DATEADD(DAY,1,d),i+1
    FROM dateCTE
    WHERE d<to_date
    )
    SELECT d,i
    FROM dateCTE

    正确的结果
    d           i
    2017-11-01 1
    2017-11-02 2
    2017-11-03 3
    2017-11-04 4
    2017-11-05 5
    2017-11-06 6
    2017-11-07 7
    2017-11-08 8
    2017-11-09 9
    2017-11-10 10
    2017-11-11 11
    2017-11-12 12
    2017-11-13 13
    2017-11-14 14
    2017-11-15 15

    为什么它在 Oracle 中不起作用?您可以建议哪些替代变体?谢谢!

    真实系统截图:

    enter image description here

    enter image description here

    enter image description here

    最佳答案

    如果您想要从日期到日期的顺序,请使用这样的选择:

    SELECT  DATE '2017-11-01' + LEVEL - 1 AS D, LEVEL AS I
    FROM DUAL
    CONNECT BY LEVEL <= DATE '2017-11-15' - DATE '2017-11-01' + 1;

    关于sql - ORACLE (11.2.0.1.0) - 带有日期表达式的递归 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526482/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com