首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >大规模插入sql - Oracle 11g

大规模插入sql - Oracle 11g
EN

Stack Overflow用户
提问于 2016-02-23 01:41:01
回答 1查看 155关注 0票数 0

我需要一个查询,以便从今天起的最后N天内将行插入到表中。

代码语言:javascript
运行
复制
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天的数据..。所以我们有:

代码语言:javascript
运行
复制
01/18/2016
01/19/2016
01/20/2016
...
02/01/2016
02/02/2016
02/03/2016
....
02/15/2016
....
02/22/2016

我希望有一个查询--或语句--根据上面的每一天插入数据,如下所示:

代码语言:javascript
运行
复制
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')

我不想每天做一次查询.

另一个编辑

很抱歉,我刚刚拿到我的工作笔记本,here...here是真正的样本:

代码语言:javascript
运行
复制
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;

但不管用..。如果我在任何日期(2016年2月14日)手动替换v_date,那么它的工作原理是.

:(

EN

回答 1

Stack Overflow用户

发布于 2016-02-23 02:07:13

如果我理解你试图正确地做什么,以下几点可能会起到作用:

代码语言:javascript
运行
复制
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

编辑

根据对问题的编辑,我们似乎可以扩大范围,如下所示:

代码语言:javascript
运行
复制
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

第二次编辑

谢谢你的澄清。也许以下几点会有所帮助:

代码语言:javascript
运行
复制
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;

祝你好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35567260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档