【问题标题】:how to use a sub query from Dual table within an Oracle insert command?如何在 Oracle 插入命令中使用双表中的子查询?
【发布时间】:2020-07-15 11:58:11
【问题描述】:

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

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: 缺少表达式
00936. 00000 - “缺少表达式”

【问题讨论】:

  • 为什么不* 60*60*24*1000 - 在我看来会更简单。

标签: sql database oracle subquery


【解决方案1】:

请使用以下查询,

您也可以在查询中指定列名

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);

【讨论】:

    【解决方案2】:

    你可以使用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 关键字不是必需的。但是,您应该包括表格的列列表。

    【讨论】:

      【解决方案3】:

      您不需要 SELECT,您应该始终为 INSERT 指定列:

      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)
      

      【讨论】:

        猜你喜欢
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多