【发布时间】:2014-02-04 03:47:20
【问题描述】:
我正在尝试将 DBMS_SCHEDULER 作业设置为在 Oracle 11g 上每年 1 月 1 日凌晨 1 点准确运行。由于时区差异或夏令时,如何设置其属性以绝对确保它不会在错误的时间执行。
我花了很多时间浏览 Oracle 文档,但我仍然没有达到确定的程度。
顺便说一句,以下是我发现并认为与主题相关的规则:
职位属性
start_date 此属性指定此作业计划开始的第一个日期。如果 start_date 和 repeat_interval 保留为空,则作业将在作业启用后立即运行。 对于使用日历表达式指定重复间隔的重复作业,start_date 用作参考日期。作业将被安排运行的第一次时间是当前日期当天或之后的日历表达式的第一个匹配项。 调度器不能保证作业会在准确的时间执行,因为系统可能会过载,从而导致资源不可用。
repeat_interval 此属性指定作业应重复的频率。您可以使用日历或 PL/SQL 表达式指定重复间隔。 对指定的表达式求值以确定下次作业应该运行的时间。如果未指定 repeat_interval,则作业将在指定的开始日期仅运行一次。有关详细信息,请参阅“日历语法”。
日历语法中的规则
- 日历语法不允许您指定时区。 相反,调度程序从 start_date 检索时区 争论。如果作业必须遵循夏令时调整,您必须 确保为该时区指定区域名称 开始日期。例如将 start_date 时区指定为 纽约的“美国/东部”将确保夏令时 自动应用调整。如果改为时区 start_date 设置为绝对偏移量,例如'-5:00', 不遵循夏令时调整,您的工作执行 将在半年中关闭一个小时。
- 当 start_date 为 NULL 时,调度程序将确定重复间隔的时区,如下所示:
- 会检查会话时区是否为区域名称。会话时区可以通过以下任一方式设置: 发出 ALTER SESSION 语句,例如:SQL> ALTER SESSION SET time_zone = '亚洲/上海';设置 ORA_SDTZ 环境 变量。
- 如果会话时区是绝对偏移量而不是区域名称,调度程序将使用 DEFAULT_TIMEZONE 调度程序属性的值。有关详细信息,请参阅 SET_SCHEDULER_ATTRIBUTE 过程。
- 如果 DEFAULT_TIMEZONE 属性为 NULL,则调度程序将在启用作业或窗口时使用 systimestamp 的时区。
【问题讨论】:
-
您不会在数据库服务器的本地“时钟”时间安排 01/01/20xx 01:00 吗?您是否尝试过运行测试?
-
说实话,这对我来说太模糊了。本地时钟调度是什么意思?属性应该如何设置?不,我还没有进行太多测试,因为我发现测试时区更改、DST 更改有点太复杂,并且仍然不能确定它是否正确。
-
@OldProgrammer:不幸的是,这样做不考虑DST。 Oracle 会将您的工作安排在非 DST 时间,如果您处于 DST 时间,那将不是您想要的时间。
标签: oracle11g timezone dst job-scheduling dbms-scheduler