Sql ORACLE(11.2.0.1.0)-带日期表达式的递归CTE
以下问题的正确答案是:Sql ORACLE(11.2.0.1.0)-带日期表达式的递归CTE,sql,oracle,common-table-expression,Sql,Oracle,Common Table Expression,以下问题的正确答案是: 如果我没记错的话,这是一个在11.2.0.3或更高版本中修复的bug。11.2.0.1不再受支持。11.2.0.4是唯一仍受支持的11.2版本–“没有名字的马” 错误号为11840579,在11.2.0.3和12.1.0.1中已修复 ——“一匹没有名字的马” 问题: 我有一张桌子 CREATE TABLE test( from_date date, to_date date ); INSERT INTO test(from_date,to_date) --VAL
如果我没记错的话,这是一个在11.2.0.3或更高版本中修复的bug。11.2.0.1不再受支持。11.2.0.4是唯一仍受支持的11.2版本–“没有名字的马”
错误号为11840579,在11.2.0.3和12.1.0.1中已修复 ——“一匹没有名字的马” 问题: 我有一张桌子
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
为什么这个递归查询在Oracle中返回了错误的结果
SQL小提琴-
我在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中不起作用?您可以推荐哪些替代方案?谢谢大家!
真实系统的屏幕截图:
如果希望有从日期到日期的顺序,请使用此选项:
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;
它在Oracle 11.2 Enterprise中为我工作。然而,您的SQL FIDLE清楚地表明,并非在每个Oracle版本中都如此 我记得我在递归查询中遇到过类似的日期问题。所以有一个bug,已经在新版本中修复了。很可能,您的Oracle版本存在此错误 解决方法:仅从递归查询中获取整数偏移量,然后将其添加到from_日期:
WITH dateCTE(from_date, i, iend) AS
(
SELECT from_date, 1 AS i, to_date - from_date as iend
FROM test
UNION ALL
SELECT from_date, i + 1, iend
FROM dateCTE
WHERE i <= iend
)
, dates as (select i, from_date + i - 1 as d from dateCTE)
SELECT d, i
FROM dates;
它在Oracle 11g中为我工作。你确定你的测试表中有正确的值吗?@pablomatico-是的,我确定。请参阅我的演示SQL Fiddle-我以前在实际系统上就已经遇到过这个问题。您的确切Oracle版本是什么?Oracle Database 11g Enterprise Edition 11.2.0.1.0-64位产品如果我没有记错的话,这是一个在11.2.0.3或更高版本中修复的错误。11.2.0.1不再受支持。11.2.0.4是唯一仍受支持的11.2版本错误号为11840579,在11.2.0.3和12.1.0中已修复。1@a_horse_with_no_name-谢谢!你能把它写下来作为答案吗?我将结束我的问题。我认为你的答案应该保留并被接受,因为有解决办法。好的。无论如何,非常感谢你!我接受了CONNECT BY语句的回答。@Thorsten Kettner-您的查询在此Oracle版本上不起作用-ORA-00600:内部错误代码,参数:[rworupo.1],[21],[8],[],[],[],[],[],[],[],[],[],[]。无论如何谢谢你!好的,老朋友。我认为它适用于任何Oracle版本。非常感谢。
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;
WITH dateCTE(from_date, i, iend) AS
(
SELECT from_date, 1 AS i, to_date - from_date as iend
FROM test
UNION ALL
SELECT from_date, i + 1, iend
FROM dateCTE
WHERE i <= iend
)
, dates as (select i, from_date + i - 1 as d from dateCTE)
SELECT d, i
FROM dates;