首页 > 解决方案 > 在 oracle 中使用递归查询

问题描述

WITH t(n) AS (
  SELECT '2009-10-08' from dual
  UNION ALL
  SELECT TO_CHAR(to_date(n,'yyyy-mm-dd') + (INTERVAL '1' DAY), 'yyyy-mm-dd' ) FROM t WHERE n > '2009-10-05'
)
SELECT * FROM t;

将 '+' 替换为 '-' 此查询的结果根本不会改变。

这怎么可能发生?

查询结果是

2009-10-08
2009-10-07
2009-10-06
2009-10-05

标签: sqloracle

解决方案


您可以简化这是您直接使用日期:

WITH t(n) AS (
  SELECT date '2009-10-08' from dual
  UNION ALL
  SELECT n - 1 
  FROM t 
  WHERE n > date '2009-10-05'
)
SELECT to_char(n, 'yyyy-mm-dd') as n 
FROM t;

返回:

N         
----------
2009-10-08
2009-10-07
2009-10-06
2009-10-05

在递归 CTE 中使用 DATE(或 TIMESTAMP)算术存在一些错误。以上使用 Oracle 12.2.0.1 和 11.2.0.3 对我有用


推荐阅读