Job: TO_CHAR(CURRENT_TIMESTAMP, 'HH24MISSFF') error

guocun09發表於2017-10-26

問題

$date -R

Fri, 10 May 2013 14:51:40 +0800

$date -u

Fri May 10 06:51:45 UTC 2013

 

CREATE TABLE GC.TEST_JOB_TIMESTAMP

(  SYST       VARCHAR2(50 BYTE),

  CURRENT_T  VARCHAR2(50 BYTE),

  TIMES      DATE)


CREATE OR REPLACE procedure GC.TEST_TIMESTAMP is

begin

INSERT INTO  GC.TEST_JOB_TIMESTAMP

SELECT  TO_CHAR (sysTIMESTAMP, 'YYYYMMDD')

          ||'T'||SUBSTR (TO_CHAR (sysTIMESTAMP, 'HH24MISSFF'), 1, 9) sysT,

          TO_CHAR (CURRENT_TIMESTAMP, 'YYYYMMDD')

          ||'T'||SUBSTR(TO_CHAR(CURRENT_TIMESTAMP, 'HH24MISSFF'), 1, 9) CURRENT_T,SYSDATE

     FROM DUAL;

END;


DECLARE

  X NUMBER;

BEGIN

  SYS.DBMS_JOB.SUBMIT

  ( job       => X

   ,what      => 'GC.TEST_TIMESTAMP;'

   ,next_date => to_date('10/05/2013 13:49:29','dd/mm/yyyy hh24:mi:ss')

   ,interval  => 'SYSDATE+10/1440'

   ,no_parse  => FALSE

  );

  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));

COMMIT;

END;

 

 

設定了job執行下面的過程後發現insert到GC.TEST_JOB_TIMESTAMP的資料為

SYST                   CURRENT_T              TIMES

20130510T143935026             20130510T063935026       2013/5/10 下午 02:39:35

 

TO_CHAR(CURRENT_TIMESTAMP, 'HH24MISSFF'), 1, 9)比正常系統時間的慢了8個小時

 

實驗證明

設定

ALTER SESSION SET NLS_LANGUAGE='AMERICAN' ;

ALTER SESSION SET NLS_TERRITORY='AMERICA' ;

ALTER SESSION SET NLS_CURRENCY='$' ;

ALTER SESSION SET NLS_ISO_CURRENCY='AMERICA' ;

ALTER SESSION SET NLS_NUMERIC_CHARACTERS='.,' ;

ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-RR' ;

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN' ;

ALTER SESSION SET NLS_SORT='BINARY';

時間問題和DBA_JOBS中的NLS_ENV欄位並無關係

 

後來發現Oracle執行JOB時首先會

alter session set time_zone='UTC';

然後再取時間

SELECT sysTIMESTAMP,CURRENT_TIMESTAMP FROM DUAL

只能用 SYSTIMESTAMP DB server的時間和時區

 

UTC

是世界統計標準時區預設 的 00

所以我們看到的時間都慢了8個小時

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2146427/,如需轉載,請註明出處,否則將追究法律責任。

相關文章