【问题标题】:SQL copy rows by date until todaySQL 按日期复制行到今天
【发布时间】:2014-12-27 14:10:56
【问题描述】:

仅供参考日期格式:YYYY.MM.DD,我想将每行增加 1 个月

我在 excel 中有以下示例表:

id   date    price
1  2013.01.01 20
2  2014.03.01 30
3  2014.04.01 30
4  2010.01.01 10

我需要插入数据库以复制直到今天的所有行:

id    date   price
1  2013.01.01 20
1  2013.02.01 20
1  2013.03.01 20
1  2013.04.01 20
....
1  2014.10.01 20
2  2014.03.01 30
...
2  2014.10.01 30
...
4  2010.01.01 10
...
4  2010.10.01 10

你能给我一些建议吗,我的第一个想法是生成日期的 JAVA 代码,但 java 数据函数不是我最好的。而且我还想用 SQL 或 PL/SQL 或者 excel 来解决它。

【问题讨论】:

  • 如何在 Oracle 中插入表数据?
  • 它已经插入的id、日期(DATE)、价格(数字)

标签: sql excel oracle date plsql


【解决方案1】:

假设您的数据确实在表格中,如果您有一个数字列表,则可以解决此问题。这是一种解决方案:

with m as (
      select trunc(sysdate) - min(date) + 1 as numdays
      from tablename t
     ),
     n as (
      select level - 1 as n
      from m
      connect by level <= m.numdays + 1
     )
select id, date + n.n as date, price
from tablename t join
     n
     on date + n.n <= sysdate;

编辑:

要按月执行此操作,我认为以下应该可行:

with m as (
      select months_between(trunc(sysdate), min(date)) + 1 as nummonths
      from tablename t
     ),
     n as (
      select level - 1 as n
      from m
      connect by level <= m.nummonths + 1
     )
select id, add_months(date, n.n) as date, price
from tablename t join
     n
     on add_months(date, n.n) <= sysdate;

【讨论】:

  • 谢谢它有效,但我只需要按月而不是按日期递增,请你帮帮我。我试图替换 add(month,1) 但 sql 中的 with 函数对我来说不清楚。
【解决方案2】:

我假设 id 是您数据集中的唯一键。您可以将这些数据传输到 Oracle 表中,然后编写函数为您完成剩下的工作。

    SQL> 
SQL> CREATE TABLE test_table(
  2  ID NUMBER,
  3  DATE1 DATE,
  4  price number);
Table created

SQL> 
SQL> INSERT INTO test_table VALUES(1,to_date('2014.10.25','yyyy.mm.dd'),20);
1 row inserted
SQL> INSERT INTO test_table VALUES(2,to_date('2014.10.27','yyyy.mm.dd'),30);
1 row inserted
SQL> INSERT INTO test_table VALUES(3,to_date('2014.10.28','yyyy.mm.dd'),30);
1 row inserted
SQL> INSERT INTO test_table VALUES(4,to_date('2014.10.31','yyyy.mm.dd'),10);
1 row inserted

SQL> commit;
Commit complete

SQL> SELECT * FROM test_table ORDER BY ID,date1;
        ID DATE1            PRICE
---------- ----------- ----------
         1 10/25/2014          20
         2 10/27/2014          30
         3 10/28/2014          30
         4 10/31/2014          10

SQL> 
SQL> CREATE OR REPLACE PROCEDURE p_test_fill_dup IS
  2  CURSOR c_data IS SELECT ID,date1,price FROM test_table;
  3  BEGIN
  4  
  5  FOR r_data IN c_data LOOP
  6    IF TRUNC(SYSDATE) = trunc(r_data.date1) THEN CONTINUE; END IF;
  7    FOR i IN 1..(TRUNC(SYSDATE) - r_data.date1) LOOP
  8      INSERT INTO test_table VALUES(r_data.id,r_data.date1+i,r_data.price);
  9      END LOOP;
 10      END LOOP;
 11      COMMIT;
 12  END     p_test_fill_dup;
 13  /
Procedure created

SQL> 
SQL> begin
  2    -- Call the procedure
  3    p_test_fill_dup;
  4  end;
  5  /
PL/SQL procedure successfully completed

SQL> SELECT * FROM test_table ORDER BY ID,date1;
        ID DATE1            PRICE
---------- ----------- ----------
         1 10/25/2014          20
         1 10/26/2014          20
         1 10/27/2014          20
         1 10/28/2014          20
         1 10/29/2014          20
         1 10/30/2014          20
         1 10/31/2014          20
         2 10/27/2014          30
         2 10/28/2014          30
         2 10/29/2014          30
         2 10/30/2014          30
         2 10/31/2014          30
         3 10/28/2014          30
         3 10/29/2014          30
         3 10/30/2014          30
         3 10/31/2014          30
         4 10/31/2014          10
17 rows selected

如果您想使用程序将月份添加到当前月份,您可以使用:

CREATE OR REPLACE PROCEDURE p_test_fill_dup IS
    CURSOR c_data IS SELECT ID,date1,price FROM test_table;
    BEGIN

    FOR r_data IN c_data LOOP
      IF TRUNC(months_between(SYSDATE,r_data.date1))=0 THEN CONTINUE; END IF;

      FOR i IN 1..TRUNC(months_between(SYSDATE,r_data.date1)) LOOP
        INSERT INTO test_table VALUES(r_data.id,add_months(r_data.date1,i),r_data.price);
        END LOOP;
       END LOOP;
       COMMIT;
   END     p_test_fill_dup;

【讨论】:

  • thx 但我不认为它的好答案我需要更多的行,我需要按月而不是按天递增。 (如果需要转的话,还有一年)
  • 用你的例子,我们怎么知道什么是月,什么是日?
  • 我编辑了我的问题以确保我的日期格式:yyyy.mm.dd
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 2011-04-18
  • 2012-07-05
  • 2012-08-20
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多