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

Oracle插入SYSDATE转Epoch时间戳报错ORA-00932求正确SQL语法

Oracle插入Epoch毫秒时间戳报错ORA-00932的解决方法

问题背景

原本通过Liquibase的changeset可以正常插入数据:

<changeSet id="1739718925270-1" author="abc">
    <insert tableName="users">
        <column name="user_id" value="abc@gmail.com"/>
        <column name="created_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="modified_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
    </insert>
</changeSet>

但直接使用SQL插入时触发ORA-00932类型不匹配错误,错误SQL如下:

INSERT INTO users 
(user_id, created_at, modified_at)
VALUES
('abc@gmail.com', SYSDATE - TO_DATE('1970-01-01')*24*60*60*1000, SYSDATE - TO_DATE('1970-01-01')*24*60*60*1000);

错误提示:

Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got DATE
00932. 00000 - "inconsistent datatypes: expected %s got %s"

created_at和modified_at为数值类型,用于存储毫秒级Epoch时间戳。

错误原因

SQL运算顺序错误:TO_DATE('1970-01-01')*24*60*60*1000试图直接让日期类型和数字相乘,导致类型不匹配。正确逻辑应该是先计算SYSDATE与1970-01-01的日期差(得到数值类型的天数),再转换为毫秒。

正确SQL语句

INSERT INTO users 
(user_id, created_at, modified_at)
VALUES
('abc@gmail.com', 
 (SYSDATE - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 24 * 60 * 60 * 1000, 
 (SYSDATE - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 24 * 60 * 60 * 1000);

补充说明

  • 给TO_DATE指定'YYYY-MM-DD'格式掩码,避免因会话日期格式差异导致解析错误
  • 用括号明确运算优先级,确保先计算日期差(得到数值),再进行单位转换

内容的提问来源于stack exchange,提问作者EV Experience

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:24:57