You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle创建含2003-01-01至2024-01-01日期列的临时表(DUAL报错)

解决Oracle生成连续日期临时表的问题

错误原因分析

你的SQL报错ORA-00936: missing expression有两个核心原因:

  • Date不是DUAL表的列,Oracle无法解析这个未知表达式;
  • DUAL表仅包含一行数据,直接查询它无法生成跨21年的连续日期序列。

正确实现方案

下面提供两种可靠方法,生成2003-01-01至2024-01-01的连续日期并插入临时表:

方法1:使用CONNECT BY层级查询(兼容所有Oracle版本)

首先创建会话级临时表(提交后数据保留,适合会话内重复使用):

CREATE GLOBAL TEMPORARY TABLE date_range_temp (
    date_col DATE
) ON COMMIT PRESERVE ROWS;

如果需要事务级临时表(提交后自动清空数据),将ON COMMIT PRESERVE ROWS改为ON COMMIT DELETE ROWS。

然后插入连续日期:

INSERT INTO date_range_temp (date_col)
SELECT DATE '2003-01-01' + LEVEL - 1
FROM DUAL
CONNECT BY DATE '2003-01-01' + LEVEL - 1 <= DATE '2024-01-01';

方法2:使用递归CTE(Oracle 11gR2及以上版本支持)

同样先创建临时表,再通过递归公共表表达式生成日期序列:

CREATE GLOBAL TEMPORARY TABLE date_range_temp (
    date_col DATE
) ON COMMIT PRESERVE ROWS;

INSERT INTO date_range_temp (date_col)
WITH date_seq AS (
    SELECT DATE '2003-01-01' AS dt FROM DUAL
    UNION ALL
    SELECT dt + 1 FROM date_seq
    WHERE dt + 1 <= DATE '2024-01-01'
)
SELECT dt FROM date_seq;

验证结果

执行以下语句查看生成的日期数据:

SELECT * FROM date_range_temp;

注意事项

  • 使用DATE 'yyyy-mm-dd'语法可以避免依赖会话的日期格式设置,确保日期解析准确;
  • 临时表仅对当前会话可见,其他会话无法访问其中的数据。

内容的提问来源于stack exchange,提问作者Karthigaipriya Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:38:23