SQL按date复制行直到今天

FYIdate格式: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代码生成的date,但Java数据function不是我最好的。 而且我想用SQL或者PL / SQL 或者excel解决它

假设你的数据真的在一个表中,你可以解决这个问题,如果你有一个数字列表。 这是一个解决scheme:

 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 + nn as date, price from tablename t join n on date + nn <= 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, nn) as date, price from tablename t join n on add_months(date, nn) <= sysdate; 

我认为这个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;