【问题标题】:Daylight saving causing issue with scheduled job timing夏令时导致计划作业时间问题
【发布时间】:2016-10-07 16:02:41
【问题描述】:

我有一个物化视图MVIEW_MY_AU,它正在从名为REFRESH_MVIEWS_VIA_PRC 的存储过程中刷新。该 SP 包含以下声明:

dbms_mview.refresh('MVIEW_MY_AU');

在 all_scheduler_jobs 表中创建一个作业REFRESH_MVIEWS_VIA_SCH 来执行这个存储过程。

查询:

select job_name, last_start_date,next_run_date,job_action from all_scheduler_jobs 
where job_name = 'REFRESH_MVIEWS_VIA_SCH'

输出:

根据计划的工作,我预计此物化视图将在澳大利亚时间凌晨 3:30 刷新。但是当它根据以下查询在澳大利亚时间凌晨 4:30 刷新时:

查询:

SELECT LAST_REFRESH              
,TO_CHAR(last_refresh, 'MM/DD/YYYY HH24:MI:SS A.M.') as LAST_REFRESH_TIME 
FROM user_mview_refresh_times
where name like 'MVIEW_MY_AU'

输出:

在澳大利亚的夏令时于 2016 年 10 月 2 日开始后,我开始面临这个问题。有没有什么办法可以安排考虑到夏令时的工作?

【问题讨论】:

    标签: oracle oracle11g scheduled-tasks


    【解决方案1】:

    Oracle 考虑夏令时的几种方式。

    为参数start_time 输入TIMESTAMP WITH TIME ZONE 值,例如SYSTIMESTAMPCURRENT_TIMESTAMP

    来自DBMS_SCHEDULER Documentation

    当 start_date 为 NULL 时,调度程序确定时区 重复间隔如下:

    1. 检查会话时区是否为区域名称。会话时区可以通过以下任一方式设置:
      • 发出 ALTER SESSION 语句,例如: SQL>ALTER SESSION SET time_zone = 'Asia/Shanghai';
      • 设置ORA_SDTZ 环境变量。
    2. 如果会话时区是绝对偏移量而不是区域名称,则调度程序使用DEFAULT_TIMEZONE调度程序的值 属性。
    3. 如果 DEFAULT_TIMEZONE 属性为 NULL,则调度程序在启用作业或窗口时使用 systimestamp 的时区。

    最重要的是:时区必须作为地区提供,例如Australia/Sydney,而不是像 +08:00 这样的 UTC 偏移量

    关于您的查询:

    视图user_mview_refresh_times 的LAST_REFRESH 列是DATE 数据类型,因此根据定义,它不包含任何时区信息。最有可能的列LAST_REFRESH 是在您的数据库操作系统服务器时区提供的(即SYSDATE 的时区值)。您的数据库操作系统服务器的时区是什么?您可以直接在操作系统上确定这一点,也可以通过

    SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;
    

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多