Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-如何每年/每月/每周重复查询_Oracle_Date_Plsql - Fatal编程技术网

Oracle-如何每年/每月/每周重复查询

Oracle-如何每年/每月/每周重复查询,oracle,date,plsql,Oracle,Date,Plsql,我进行了查询,以从日期为2018年12月的所选列中获取行: SELECT myColumn1, myColumn2 FROM MyTable WHERE to_char(myColumn_DATE, 'YYYY/MM') = '2018/12' 这非常简单,我现在可以使用这些行来创建一些进一步的逻辑。但是,如果我需要在给定的一年中的每个月,甚至每个星期重复这一点,该怎么办 我正在将查询结果导出到单独的excel表中,因此我想我每次都必须手动检查正确的日期间隔,并且无法聚合全年/月/等的数据。

我进行了查询,以从日期为2018年12月的所选列中获取行:

SELECT myColumn1, myColumn2 
FROM MyTable
WHERE to_char(myColumn_DATE, 'YYYY/MM') = '2018/12'
这非常简单,我现在可以使用这些行来创建一些进一步的逻辑。但是,如果我需要在给定的一年中的每个月,甚至每个星期重复这一点,该怎么办


我正在将查询结果导出到单独的excel表中,因此我想我每次都必须手动检查正确的日期间隔,并且无法聚合全年/月/等的数据。是否有一些PL/SQL方法可以避免这种繁琐的重复?

假设您在2018年12月的某一天,您的目标是通过表
MyTable
中的数据填充表
MyTable 2

首先,让我们创建没有数据的
MyTable2

create table MyTable2 as
select myColumn1, myColumn2 
  from MyTable
 where 1 = 9;
然后创建一个在每个月的最后一天填充MyTable2的过程

create or replace procedure pr_populate_Mytable2 is
begin
   insert into MyTable2
   select myColumn1, myColumn2 
     from MyTable
    where to_char(myColumn_DATE, 'YYYY/MM') = to_char(sysdate,'YYYY/MM');
 commit;
end;
通过从dbms_调度程序调用过程

declare
    v_job_name varchar2(32) := 'jb_populate_Mytable2';
begin  
    dbms_scheduler.create_job(
        job_name => v_job_name,
        job_type => 'STORED_PROCEDURE',
        job_action => 'pr_populate_Mytable2', 
        start_date => to_date('31-12-2018 20:00:00', 'dd-mm-yyyy hh24:mi:ss'),
        repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=-1; BYHOUR=21;',
        auto_drop => false,
        comments => 'Populates our table on the last day of every month at 21 o''clock ');

    dbms_scheduler.enable(v_job_name);    
end;

从12月最后一天的晚上8点开始,在接下来的几个月的最后几天晚上9点重复。

您可以使用
按级别连接SOM。您是否正在寻找一个查询,该查询包含全年的数据,但将结果按周进行划分——例如,包含一年中的一周字段?或者你只是想在不同的几周内重复查询?我会继续重复查询,因为我将在结果行上使用许多聚合函数来获取该时间段的一些度量。当然,如果划分全年是一种更简单的方法,我也非常愿意接受这样的建议!如何导出数据?到目前为止,您仅显示给定范围内的所有行。您可以将其重写为
其中myColumn\u DATE>=日期'2018-12-01'和myColumn\u DATE
或更一般的绑定变量,其中myColumn\u DATE>=:DATE\u start和myColumn\u DATE<:DATE\u after
。当然,您可以使用某些编程语言(例如VBA)在循环中运行此查询。@ThorstenKettner说起来很尴尬,但目前我正在通过SQL Developer手动导出它。我仍在试图找出我的sqlplus cli。哇,有趣的方法!然而,现在我需要从过去的时间段获得所有信息,以进行更复杂的数据分析。这个选择仍然让我很感兴趣!您的意思是,使用这个所谓的
dbms\u调度程序调用一个过程将在给定的时间运行我的脚本?如果我的服务器意外关闭,它会永远错过实际的查询吗?谢谢。是的,将在给定的时间运行,即使在数据库实例恢复之后。如果DB的版本为
11gR2+
,则可以通过将
job\u queue\u进程
值设置为零来防止它们在重新启动后运行。顺便说一句,我去年夏天去过的布达佩斯是一个令人钦佩的城市:)希望你在那里生活得好。谢谢你的信息!谢谢你的好话,现在天气暖和了,这座城市一定很可爱!:)
--Months for the current year.
select add_months(trunc(sysdate, 'year'), level-1) the_month
from dual
connect by level <= 12;

THE_MONTH
---------
2019-01-01
2019-02-01
2019-03-01
2019-04-01
2019-05-01
2019-06-01
2019-07-01
2019-08-01
2019-09-01
2019-10-01
2019-11-01
2019-12-01
select *
from
(
    --Months for the current year.
    select add_months(trunc(sysdate, 'year'), level-1) the_month
    from dual
    connect by level <= 12
) months
left join mytable
    on months.the_month = trunc(mycolumn_date, 'month');