Oracle資料庫時區

13811135929發表於2017-04-01
    對於全球化的業務而言,業務必須在多個時區之間正常運轉。從9i版本開始,Oracle環境能夠知道所使用時區。為了實現這個功能,需要指定資料庫所執行的時區以及使用TIMESTAMP WITH TIME ZONE與TIMESTAMP WITH LOCAL TIME ZONE資料型別。前一種具有一個時區指示符,這個指示符說明了其引用的時區。後一種資料型別在儲存時會被規範化為資料庫時區,但隨後在檢索時會轉換為客戶端的時區。普通的DATE和TIMESTAMP資料型別在儲存時始終會規範為資料庫時區,並且會在查詢過程原樣顯示。
 關於timestamp的幾個函式:
 sysdate    資料庫伺服器作業系統時間,顯示不含時區(其實隱含了時區)。
 systimestamp 資料庫伺服器操作系統時間以及時區
 注意上述兩個函式的返回值不會受到客戶端影響。

 localtimestamp      根據客戶端時區轉換成客戶端當前時間,但顯示並不含時區
 current_timestamp 根據客戶端時區轉換成客戶端當前時間,包含客戶端時區
 注意上述兩個函式的返回值和客戶端時區設定有關,會轉換為客戶端時區的時間。

【實驗一】
資料庫伺服器作業系統時間及時區:
linux-qtx3:~ # date -R
Thu, 30 Mar 2017 07:18:52 -0400

1.客戶端在東8區的情況:

分別查詢sysdate,systeimstamp,localtimestamp以及current_timestamp

命令

輸出

select sysdate from dual;

2017/3/30 7:22:47

select systimestamp from dual;

30-MAR-17 07.22.56.731121 AM -04:00

select localtimestamp from dual;

30-MAR-17 07.23.06.814472 PM

select current_timestamp from dual;

30-MAR-17 07.23.14.907555 PM +08:00


2.將客戶端修改為東7區:

再次執行上述命令:

命令

輸出

select sysdate from dual;

2017/3/30 7:31:27

select systimestamp from dual;

30-MAR-17 07.32.41.710320 AM -04:00

select localtimestamp from dual;

30-MAR-17 06.33.00.222382 PM

select current_timestamp from dual;

30-MAR-17 06.33.14.242552 PM +07:00


3.修改資料庫伺服器時間為3月29日
linux-qtx3:~ # date -R
Wed, 29 Mar 2017 03:00:02 -0400
接著按照步驟2中TIME_ZONE='+7:00'設定執行命令:

命令

輸出

select sysdate from dual;

2017/3/29 3:00:49

select systimestamp from dual;

29-MAR-17 03.00.59.413491 AM -04:00

select localtimestamp from dual;

29-MAR-17 02.01.08.518988 PM

select current_timestamp from dual;

select current_timestamp from dual;


【實驗二】

點選(此處)摺疊或開啟

  1. CREATE TABLE T(ID number(2),time_tz timestamp with time zone,time_lc_tz timestamp with local time zone);
  2. select sessiontimezone from dual;

  3. SESSIONTIMEZONE
  4. ---------------------------------------------------------------------------
  5. -04:00

  6. insert into t values(1,to_timestamp('2017-03-30 11:09:00','YYYY-MM-DD HH24:MI:SS'),to_timestamp('2017-03-30 11:09:00','YYYY-MM-DD HH24:MI:SS'));
  7. commit;
在西四區的客戶端上向表t插入上述資料,在東七區客戶端查詢結果會是什麼樣呢?

點選(此處)摺疊或開啟

  1. SELECT sessiontimezone FROM dual;
     
    SESSIONTIMEZONE
    ---------------------------------------------------------------------------
    +07:00

  2. SELECT * FROM t;
  3.  
  4.  ID TIME_TZ                                TIME_LC_TZ
  5. --- -----------------------------------------------------------------------------
  6.   1 30-MAR-17 11.09.00.000000 AM -04:00    30-MAR-17 10.09.00.000000 PM
可以看到對於time zone型別的資料,由於已經帶了時區資訊,無論在哪個時區的客戶端查詢都是一樣的;對於local time zone型別的資料,由於插入的時候是A時區的時間資訊,到B時區的客戶端查詢就應該進行相應的轉換。

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

相關文章