Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORACLE(11.2.0.1.0)-带日期表达式的递归CTE_Sql_Oracle_Common Table Expression - Fatal编程技术网

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;