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
相关产品推荐
相关产品推荐

