以下问题的正确答案:
如果我没有记错的话,那是在11.2.0.3或更高版本中修复的错误。(无论如何不再支持11.2.0.1.11.2.0.4是唯一仍受支持的11.2版本)-@a_horse_with_no_name 错误号为11840579,已在11.2.0.3和12.1.0.1中进行了修复-@a_horse_with_no_name问题
I have a 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'));
The following query in Oracle return only one row (expected 15 rows)
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
For test I changed the condition to i<10
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
And get the next result
| 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 |
Why do this recursive query returned bad result in Oracle?
SQL Fiddle - http://sqlfiddle.com/#!4/36907/5
为了进行测试,我将条件更改为 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,DATEADD(DAY,1,d),i+1 FROM dateCTE WHERE d<to_date ) SELECT d,i FROM dateCTE
The right result
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
如果您希望有一个连续的起始日期到最新日期,请使用以下选择:
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;