【问题标题】:How to insert data into oracle database table using PL SQL which includes 365 days of the year如何使用 PL SQL 将数据插入到 oracle 数据库表中,其中包括一年中的 365 天
【发布时间】:2019-02-26 12:52:34
【问题描述】:

我已经在 oracle 中建立了一个表。我正在尝试插入一些如下所示的数据:

但是,我似乎无法将 DATE 与 ID、YEAR 和 INDICATOR 一起添加。

我设法从 2019 年 1 月 1 日下午 7:00:00 到 2019 年 12 月 31 日晚上 7:00:00 获得 DATE。

代码:

INSERT INTO TABLE(DATE)
select to_date('01-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') + rownum -1 dt from dual 
connect by level <= to_date('05-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') - 
                    to_date('01-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') + 1;

当我排除 DATE 时,它看起来像这样:

代码:

INSERT INTO TABLE (ID, YEAR, INDICATOR)
Values (sequ.nextval, '2019', 'X') ;

我尝试将这两个代码结合起来,但它不起作用。我还有其他方法可以使它起作用吗?还是我做错了? 唯一的更改数据是 DATE,因为我需要它是 2019 年的 365 天。 对于所有数据,YEAR 和 INDICATOR 保持不变。

【问题讨论】:

    标签: sql oracle sql-insert


    【解决方案1】:

    这是你想要的吗?

    insert into table(id, "date", "year", indicator)
        select rownum, dt, extract(year from dt), 'X'
        from (select to_date('01-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') + rownum - 1 as dt
              from dual 
              connect by level <= to_date('05-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') - 
                            to_date('01-01-2019 7:00:00 PM', 'DD-MM-YYYY HH:MI:SS PM') + 1
             ) t;
    

    【讨论】:

    • 我之前尝试过类似的方法,但它不起作用。您给我的代码包含错误说明 ORA-00904: "YEAR": invalid identifier。这是什么意思?
    • @prestan - 这意味着这不是很有效的 Oracle 语法 *8-) 将 year(dt) 更改为 extract(year from dt),当然也可以是一个固定值 - 从日期中获取年份更优雅(如果重复)特别是如果真正的查询基于当前日期而不是硬编码的日期范围。
    【解决方案2】:

    甚至更短(假设您可以计算当前年份):

    insert into table( id, date, year, indicator) 
        select sequ.nextval, to_date('31-12-2018 07:00:00', 'DD-MM-YYYY HH24:MI:SS') + rownum, 2019, 'X' from all_objects where rownum <= 365
    

    或者,如果您不想使用 ALL_OBJECTS 表:

    insert into table( id, date, year, indicator) 
        select sequ.nextval, to_date('31-12-2018 07:00:00', 'DD-MM-YYYY HH24:MI:SS') + level, 2019, 'X' from dual connect by level <= 365
    

    【讨论】:

    • 我都试过了,但结果都是错误 --> ORA-00913: too many values。这是什么意思?
    • 到多个值:插入表 (......) 列是否正确?你不能插入错误的列数
    • 试试语句“select sequ.nextval, to_date('31-12-2018 07:00:00', 'DD-MM-YYYY HH24:MI:SS') + level, 2019, 'X' from dual connect by level
    • 如果明年再次运行,硬编码 365 可能会成为问题……不过,您可以从 sysdate 获取年份和天数。
    • 我的错,我忽略了一些东西。感谢您的帮助。有用。 @nabuchodonossor
    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2012-02-22
    • 2021-12-20
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多