sql—如何在oracle insert命令中使用来自双表的子查询?

fwzugrvs  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(542)

这个命令应该将一个字段之一为毫秒的记录(通过子查询获取)插入表中,但返回一个错误。有什么问题?

insert into table1 values ( select trunc( (to_date('2019-11-26 01:00:00', 'YYYY-MM-DD HH24:MI:SS') - to_date('1970-01-01', 'YYYY-MM-DD')) * power(60, 2) * 24 * power(10, 3)) from dual, 0, 0, 0);

错误报告-sql错误:
ora-00936:缺少表达式
93600000-“缺少表达式”

kxeu7u2r

kxeu7u2r1#

请使用下面的查询,
还可以指定查询中的列名

insert into table1(col1, col2, col3 ...) ( select trunc( (to_date('2019-11-26 01:00:00', 'YYYY-MM-DD HH24:MI:SS') - to_date('1970-01-01', 'YYYY-MM-DD')) * power(60, 2) * 24 * power(10, 3)),0, 0, 0 from dual);
yqyhoc1h

yqyhoc1h2#

你可以用 insert . . . select :

insert into table1 
    select trunc( (to_date('2019-11-26 01:00:00', 'YYYY-MM-DD HH24:MI:SS') - to_date('1970-01-01', 'YYYY-MM-DD')) * power(60, 2) * 24 * power(10, 3)),
           0, 0, 0
from dual;

这个 values 关键字不是必需的。但是,应该包括表的列列表。

ttcibm8c

ttcibm8c3#

您不需要选择,并且应始终指定插入列:

insert into table1 (col1, col2, col3, col4)
values (
   trunc( (to_date('2019-11-26 01:00:00', 'YYYY-MM-DD HH24:MI:SS') - DATE '1970-01-01') * 60*60*24*1000), 0, 0, 0
   );

注意,我假设您喜欢计算javascript时间戳或类似的时间戳。这是自 1970-01-01 00:00:00**UTC** . 对于精确的值(即,如果毫秒很重要)和正确的时区处理,您应该使用 TIMESTAMP WITH TIME ZONE 而不是 DATE . 例如:

TRUNC((TO_TIMESTAMP_TZ('2019-11-26 01:00:00.00 Europe/Zurich', 'YYYY-MM-DD HH24:MI:SS.FF TZR') - TIMESTAMP '1970-01-01 00:00:00 UTC') *  60*60*24*1000)

相关问题