1. 程式人生 > >Oracle時間戳型別

Oracle時間戳型別

    Oracle Databse 9i資料庫引入了一種新特性,可以儲存時間戳。時間戳可以儲存世紀、4位年、月、日、時(以24小時格式)、分、秒。與DATE型別相比,時間戳具有以下優點:

    ● 時間戳可以儲存秒的小數位。

    ● 時間戳可以儲存時區。

    下面介紹時間戳型別。

 使用時間戳型別

    時間戳有3種類型,如表所示。

    表  時間戳型別

類    型 說    明
TIMESTAMP[(seconds_precision)] 存 儲世紀、4位的年、月、日、時(以24小時格式)、分和秒。seconds_precision為可選引數,用於指定精度,該引數為一個整數,範圍從 0~9,預設值為9;意思是表示秒的數字的小數點右邊可以儲存9位數字。如果試圖在秒的小數中儲存超過TIMESTAMP儲存精度的數字,那麼該小數將被 取整
TIMESTAMP[(seconds_precision)]WITH TIME ZONE 擴充套件TIMESTAMP,用於儲存時區
TIMESTAMP[(seconds_precision)]WITH LOCAL TIME ZONE 擴充套件TIMESTAMP,將給定的時間值轉換成資料庫的本地時區。轉換過程稱為時間值的規格化(normalizing)

    接下來的幾節將介紹如何使用這些時間戳。

1. 使用TIMESTAMP型別

    與其他型別類似,TIMESTAMP型別也可以用來在表中定義列。下面這個語句用於建立一個表purchases_with_timestamp, 該表用來儲存顧客的購買記錄。該表包含了一個TIMESTAMP型別的列made_on,該列用來記錄顧客在何時購買了產品。注意TIMESTAMP的精 度設定為4(這意味著在秒的小數點右邊可以儲存4位小數):

Sql程式碼 

 收藏程式碼

  1.  CREATE TABLE purchases_with_timestamp (  
  2. product_id INTEGER REFERENCES products(product_id),  
  3. customer_id INTEGER REFERENCES customers(customer_id),  
  4. made_on TIMESTAMP(4)  
  5. );  

注意:

purchases_with_timestamp表由store_schema.sql指令碼建立和填充。本章的其他表也是由該指令碼建立,因此不需要輸入CREATE TABLE語句或本章所示的任何INSERT語句。

要向資料庫提供一個TIMESTAMP字面值,可以在一個時間值前面指定TIMESTAMP關鍵字,格式如下:

Sql程式碼 

 收藏程式碼

  1. TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.SSSSSSSSS'  

     注意在小數點後面有9個S字元,這意味著可以在字串中為秒的小數部分指定9個數字。TIMESTAMP列中可以實際儲存多少位數字取決於在定義該列時為 秒的小數部分指定了多少位數字。例如,purchases_with_timestamp表的made_on列可以儲存最多4位小數的秒數。如果試圖向該 表中新增一行秒的精度超過4位小數的記錄,小數部分就會被取整。例如:

Sql程式碼 

 收藏程式碼

  1. 2005-05-13 07:15:31.123456789  

     將被取整為:

Sql程式碼 

 收藏程式碼

  1. 2005-05-13 07:15:31.1235  

    下面這個INSERT語句向purchases_with_timestamp表中新增一行記錄,注意此處使用了TIMESTAMP關鍵字指定一個時間值:

Sql程式碼 

 收藏程式碼

  1. INSERT INTO purchases_with_timestamp (  
  2. product_id, customer_id, made_on  
  3. ) VALUES (  
  4. 1, 1, TIMESTAMP '2005-05-13 07:15:31.1234'  
  5. );  

    下面這個查詢對purchases_with_timestamp表進行檢索:

Sql程式碼 

 收藏程式碼

  1.  SELECT *  
  2. FROM purchases_with_timestamp;  
  3. PRODUCT_ID CUSTOMER_ID  MADE_ON  
  4. ---------- -----------  --------------------------  
  5. 1              1 13-MAY-05 07.15.31.1234 AM  

2. 使用TIMESTAMP WITH TIME ZONE型別

TIMESTAMP WITH TIME ZONE型別對TIMESTAMP進行了擴充套件,用於儲存時區。下面這個語句建立一個表purchases_timestamp_with_tz,該表用於 儲存顧客的購買記錄。該表包含了一個TIMESTAMP WITH TIME ZONE型別的列made_on,該列用來記錄該顧客在何時購買了產品:

Sql程式碼 

 收藏程式碼

  1.  CREATE TABLE purchases_timestamp_with_tz (  
  2. product_id INTEGER REFERENCES products(product_id),  
  3. customer_id INTEGER REFERENCES customers(customer_id),  
  4. made_on TIMESTAMP(4) WITH TIME ZONE  
  5. );  

要向資料庫提供一個帶有時區資訊的時間戳,可以在TIMESTAMP子句中加上時區資訊。例如,下面這個TIMESTAMP子句包含了時差-07:00:

Sql程式碼 

 收藏程式碼

  1.  TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'  
  2. 此處也可以指定一個時區名,下面這個例子就指定PST作為時區使用:  
  3. TIMESTAMP '2005-05-13 07:15:31.1234 PST'  
  4. 下面這個INSERT語句向purchases_timestamp_with_tz表中新增兩行記錄:  
  5. INSERT INTO purchases_timestamp_with_tz (  
  6. product_id, customer_id, made_on  
  7. ) VALUES (  
  8. 1, 1, TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'  
  9. );  
  10. INSERT INTO purchases_timestamp_with_tz (  
  11. product_id, customer_id, made_on  
  12. ) VALUES (  
  13. 1, 2, TIMESTAMP '2005-05-13 07:15:31.1234 PST'  
  14. );  

下面這個查詢對purchases_timestamp_with_tz表進行檢索:

Sql程式碼 

 收藏程式碼

  1.  SELECT *  
  2. FROM purchases_timestamp_with_tz;  
  3. PRODUCT_ID  CUSTOMER_ID MADE_ON  
  4. ----------  ----------- ---------------------------------  
  5. 1             1  13-MAY-05 07.15.31.1234 AM -07:00  
  6. 1             2  13-MAY-05 07.15.31.1234 AM PST  

3. 使用TIMESTAMP WITH LOCAL TIME ZONE型別

TIMESTAMP WITH LOCAL TIME ZONE型別對TIMESTAMP進行了擴充套件,用於儲存一個轉換為資料庫設定的本地時區的時間戳。在為一個TIMESTAMP WITH LOCAL TIME ZONE型別的列儲存一個時間戳值時,這個時間戳就被轉換(或被規格化)為資料庫的時區設定。當檢索這個時間戳時,它就被規格化為當前會話中的時區設定。

提示:

如果企業已經實現了一個全球系統,可以通過世界各地訪問,那麼就應該使用TIMESTAMP WITH LOCAL TIME ZONE型別來儲存時間戳。這是因為資料庫會將時間戳儲存為資料庫所在時區中的本地時間,但是在對它們進行檢索時,卻可以看到規格化為本地時區的時間戳。

假設資料庫時區是PST(比UTC晚8個小時),想向資料庫中儲存下面的時間戳:

2005-05-13 07:15:30 EST

由於EST比UTC晚5個小時,因此EST與PST之間差3個小時(8 - 5 = 3)。要將前面的時間戳規格化為PST,就必須從時間戳中減去3個小時就得到下面的規格化的時間戳:

2005-05-13 04:15:30

這是資料庫的TIMESTAMP WITH LOCAL TIME ZONE列中所儲存的時間戳。

下面這個語句建立一個表purchases_ with_local_tz,該表用於儲存顧客的購買記錄。該表包含了一個TIMESTAMP WITH LOCAL TIME ZONE型別的列made_on,該列用來記錄顧客在何時購買了產品:

Sql程式碼 

 收藏程式碼

  1.  CREATE TABLE purchases_with_local_tz (  
  2. product_id INTEGER REFERENCES products(product_id),  
  3. customer_id INTEGER REFERENCES customers(customer_id),  
  4. made_on TIMESTAMP(4) WITH LOCAL TIME ZONE  
  5. );  

 下面這個INSERT語句向purchases_ with_local_tz表中新增一行記錄,並將該行的made_on列值設定為2005-05-13 07:15:30 EST:

Sql程式碼 

 收藏程式碼

  1.  INSERT INTO purchases_with_local_tz (  
  2. product_id, customer_id, made_on  
  3. ) VALUES (  
  4. 1, 1, TIMESTAMP '2005-05-13 07:15:30 EST'  
  5. );  

雖然made_on列的時間戳設定為2005-05-13 07:15:30 EST,但資料庫中實際儲存的時間戳是2005-05-13 04:15:30(時間戳規格化為PST)。

下面這個查詢對purchases_ with_local_tz表進行檢索:

Sql程式碼 

 收藏程式碼

  1.  SELECT *  
  2. FROM purchases_with_local_tz;  
  3. PRODUCT_ID  CUSTOMER_ID  MADE_ON  
  4. ----------  -----------  --------------------------  
  5. 1             1   13-MAY-05 04.15.30.0000 AM  

因為我的資料庫時區和會話時區都是PST,所以此查詢返回的時間戳都是針對PST的。

警告:

前面這個查詢返回的時間戳規格化為PST。如果資料庫時區或會話時區不是PST,則執行查詢時返回的時間戳會有所不同(它將規格化為您的時區)。

如果將當前會話的本地時區設定為EST,並重新執行上面這個查詢,就會看到時間戳被規格化為EST:

Sql程式碼 

 收藏程式碼

  1.  ALTER SESSION SET TIME_ZONE = 'EST';  
  2. Session altered.  
  3. SELECT *  
  4. FROM purchases_with_local_tz;  
  5. PRODUCT_ID CUSTOMER_ID  MADE_ON  
  6. ---------- -----------  --------------------------  
  7. 1             1   13-MAY-05 07.15.30.0000 AM  

可以看到,此查詢返回的時間戳是13-MAY-05 07.15.30.0000 AM,這是規格化為會話時區EST的時間戳。因為EST比PST早3小時,所以必須將13-MAY-05 04:15:30(資料庫中儲存的時間戳)增加3小時,得到13-MAY-05 07.15.30 AM(查詢返回的時間戳)。

下面這條語句將會話時區設定回PST:

Sql程式碼 

 收藏程式碼

  1. ALTER SESSION SET TIME_ZONE = 'PST';  
  2. ession altered.