title: How to schedule an Oracle dbms_scheduler Job timezone and DST safely
body: <p>I am trying to setup a DBMS_SCHEDULER Job to run exactly at 1 AM on 1st of January every year on Oracle 11g. How to setup its attributes to be absolutely sure it wont get executed in wrong hour, because of timezone differences nor Daylight Savings Time.</p>
  
  <p>I have spent plenty of time going through Oracle documentation, but I have still not reached the level of certainity.</p>
  
  <p>Just btw, here are the rules which I found and consider relevant to the subject:</p>
  
  <p><strong>Job attributes</strong></p>
  
  <p><strong>start_date</strong>  This attribute specifies the first date on which this job is scheduled to start. If start_date and repeat_interval are left null, then the job is scheduled to run as soon as the job is enabled.
  For repeating jobs that use a calendaring expression to specify the repeat interval, start_date is used as a reference date. The first time the job will be scheduled to run is the first match of the calendaring expression that is on or after the current date.
  The Scheduler cannot guarantee that a job will execute on an exact time because the system may be overloaded and thus resources unavailable.</p>
  
  <p><strong>repeat_interval</strong> This attribute specifies how often the job should repeat. You can specify the repeat interval by using calendaring or PL/SQL expressions.
  The expression specified is evaluated to determine the next time the job should run. If repeat_interval is not specified, the job will run only once at the specified start date. See "Calendaring Syntax" for further information.</p>
  
  <p><strong>Rules in Calendaring syntax</strong></p>
  
  <ul>
  <li>The calendaring syntax does not allow you to specify a time zone.
  Instead the Scheduler retrieves the time zone from the start_date
  argument. If jobs must follow daylight savings adjustments you must
  make sure that you specify a region name for the time zone of the
  start_date. For example specifying the start_date time zone as
  'US/Eastern' in New York will make sure that daylight saving
  adjustments are automatically applied. If instead the time zone of
  the start_date is set to an absolute offset, such as '-5:00',
  daylight savings adjustments are not followed and your job execution
  will be off by an hour half of the year.</li>
  <li>When start_date is NULL, the Scheduler will determine the time zone for the repeat interval as follows:</li>
  <li>It will check whether the session time zone is a region name. The session time zone can be set by either:
  Issuing an ALTER SESSION statement, for example: SQL> ALTER SESSION
  SET time_zone = 'Asia/Shanghai'; Setting the ORA_SDTZ environment
  variable.</li>
  <li>If the session time zone is an absolute offset instead of a region name, the Scheduler will use the value of the DEFAULT_TIMEZONE Scheduler attribute. For more information, see the SET_SCHEDULER_ATTRIBUTE Procedure.</li>
  <li>If the DEFAULT_TIMEZONE attribute is NULL, the Scheduler will use the time zone of systimestamp when the job or window is enabled.</li>
  </ul>