[英]Massive insert sql - Oracle 11g
我需要一个查询,以便在从今天起的过去N天内将行插入表中。
Insert into Table select 'xpto', name
from users where login_date between
TO_DATE(:DATE || ' 00:00:00', 'mm/dd/yyyy HH24:MI:SS')
and TO_DATE(:DATE || ' 23:59:59', 'mm/dd/yyyy HH24:MI:SS')
我需要此:DATE代表最近30天...(每天)..因此,它将是30个插入。
我怎样才能做到这一点?
编辑
假设我要插入最近30天的数据...因此,我们有:
01/18/2016
01/19/2016
01/20/2016
...
02/01/2016
02/02/2016
02/03/2016
....
02/15/2016
....
02/22/2016
我想要一个查询-或语句-根据上述每一天插入我的数据,如下所示:
Insert into Table select 'xpto', name
from users where login_date between
TO_DATE('01/15/2016' || ' 00:00:00', 'mm/dd/yyyy HH24:MI:SS')
and TO_DATE('01/15/2016' || ' 23:59:59', 'mm/dd/yyyy HH24:MI:SS')
--- another insert
Insert into Table select 'xpto', name
from users where login_date between
TO_DATE('01/16/2016' || ' 00:00:00', 'mm/dd/yyyy HH24:MI:SS')
and TO_DATE('01/16/2016' || ' 23:59:59', 'mm/dd/yyyy HH24:MI:SS')
我不想每天查询一次...
另一个编辑
对不起,我只是把我的工作笔记本放在这里...这是真实的示例:
BEGIN
for day in (SELECT to_char(TO_DATE (SYSDATE, 'dd/mm/yyyy')-30 + LEVEL) AS DATE_CHECK
FROM DUAL
CONNECT BY SYSDATE - 30 + LEVEL <= SYSDATE)
LOOP
v_date := to_char(day.date_check);
INSERT INTO resume (date_check, type, total)
SELECT v_data AS DATA, type, COUNT (*) total
FROM ( select ....
from table
WHERE DATE_COLUMN BETWEEN TO_DATE(v_data ||' 00:00:00', 'dd/mm/yyyy hh24:mi:ss') and TO_DATE(v_date || ' 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
union
select ....
from table
WHERE DATE_COLUMN BETWEEN TO_DATE(v_data ||' 00:00:00', 'dd/mm/yyyy hh24:mi:ss') and TO_DATE(v_date || ' 23:59:59', 'dd/mm/yyyy hh24:mi:ss')
)
end loop;
end;
但是它不起作用...如果我执行相同的插入操作,请用任意日期(14/02/2016)手动替换v_date。
:(
如果我了解您要正确执行的操作,则可能会起作用:
Insert into Table
select 'xpto', name
from users
where login_date between TRUNC(SYSDATE) - INTERVAL '30' DAY
and TRUNC(SYSDATE) + INTERVAL '1' DAY - INTERVAL '1' SECOND
根据对问题的编辑,似乎我们可以扩大范围,如下所示:
Insert into Table
select 'xpto', name
from users
where login_date between TO_DATE('01/18/2016', 'MM/DD/YYYY')
and TO_DATE('02/22/2016', 'MM/DD/YYYY') + INTERVAL '1' DAY - INTERVAL '1' SECOND
谢谢您的澄清。 也许以下方法会有所帮助:
BEGIN
for day in (SELECT TRUNC(SYSDATE)-30 + LEVEL AS DATE_CHECK
FROM DUAL
CONNECT BY TRUNC(SYSDATE) - 30 + LEVEL <= TRUNC(SYSDATE))
LOOP
INSERT INTO resume (date_check, type, total)
SELECT day.DATE_CHECK AS DATA, type, COUNT (*) total
FROM (select ....
from table
WHERE DATE_COLUMN = TRUNC(day.DATE_CHECK));
end loop;
end;
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.