sql - 在 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
解决方案
您可以简化这是您直接使用日期:
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 对我有用
推荐阅读
- haskell - Replacing do by >>= for a scotty post
- python - 如何使 Python argparse 正确解释与命令匹配的参数?
- c++ - 如何使用模板
在 file.h 和 file.cpp 中调用 main.cpp? - python-3.x - 为什么 super() 将我的 tkinter 小部件翻倍?
- python - 我们可以在python中使用点符号访问类方法变量吗
- ruby - 使用 rbenv 安装新 ruby 版本的问题
- python - 使用单元测试模拟在函数中间创建的引用对象
- sql - Hive 窗口函数:前一个分区的最后一个值
- javascript - JS if 语句中的 PHP else if 语句条件为真时出错。
- javascript - Uncaught TypeError, innerHTML of null error at random when target string is too long