Oracle時間戳型別
Oracle Databse 9i資料庫引入了一種新特性,可以儲存時間戳。時間戳可以儲存世紀、4位年、月、日、時(以24小時格式)、分、秒。與DATE型別相比,時間戳具有以下優點:
● 時間戳可以儲存秒的小數位。
● 時間戳可以儲存時區。
下面介紹時間戳型別。
使用時間戳型別
時間戳有3種類型,如表所示。
表 時間戳型別
|
接下來的幾節將介紹如何使用這些時間戳。
1. 使用TIMESTAMP型別
與其他型別類似,TIMESTAMP型別也可以用來在表中定義列。下面這個語句用於建立一個表purchases_with_timestamp, 該表用來儲存顧客的購買記錄。該表包含了一個TIMESTAMP型別的列made_on,該列用來記錄顧客在何時購買了產品。注意TIMESTAMP的精 度設定為4(這意味著在秒的小數點右邊可以儲存4位小數):
Sql程式碼
- CREATE TABLE purchases_with_timestamp (
- product_id INTEGER REFERENCES products(product_id),
- customer_id INTEGER REFERENCES customers(customer_id),
- made_on TIMESTAMP(4)
- );
注意:
purchases_with_timestamp表由store_schema.sql指令碼建立和填充。本章的其他表也是由該指令碼建立,因此不需要輸入CREATE TABLE語句或本章所示的任何INSERT語句。
要向資料庫提供一個TIMESTAMP字面值,可以在一個時間值前面指定TIMESTAMP關鍵字,格式如下:
Sql程式碼
- TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.SSSSSSSSS'
注意在小數點後面有9個S字元,這意味著可以在字串中為秒的小數部分指定9個數字。TIMESTAMP列中可以實際儲存多少位數字取決於在定義該列時為 秒的小數部分指定了多少位數字。例如,purchases_with_timestamp表的made_on列可以儲存最多4位小數的秒數。如果試圖向該 表中新增一行秒的精度超過4位小數的記錄,小數部分就會被取整。例如:
Sql程式碼
- 2005-05-13 07:15:31.123456789
將被取整為:
Sql程式碼
- 2005-05-13 07:15:31.1235
下面這個INSERT語句向purchases_with_timestamp表中新增一行記錄,注意此處使用了TIMESTAMP關鍵字指定一個時間值:
Sql程式碼
- INSERT INTO purchases_with_timestamp (
- product_id, customer_id, made_on
- ) VALUES (
- 1, 1, TIMESTAMP '2005-05-13 07:15:31.1234'
- );
下面這個查詢對purchases_with_timestamp表進行檢索:
Sql程式碼
- SELECT *
- FROM purchases_with_timestamp;
- PRODUCT_ID CUSTOMER_ID MADE_ON
- ---------- ----------- --------------------------
- 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程式碼
- CREATE TABLE purchases_timestamp_with_tz (
- product_id INTEGER REFERENCES products(product_id),
- customer_id INTEGER REFERENCES customers(customer_id),
- made_on TIMESTAMP(4) WITH TIME ZONE
- );
要向資料庫提供一個帶有時區資訊的時間戳,可以在TIMESTAMP子句中加上時區資訊。例如,下面這個TIMESTAMP子句包含了時差-07:00:
Sql程式碼
- TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'
- 此處也可以指定一個時區名,下面這個例子就指定PST作為時區使用:
- TIMESTAMP '2005-05-13 07:15:31.1234 PST'
- 下面這個INSERT語句向purchases_timestamp_with_tz表中新增兩行記錄:
- INSERT INTO purchases_timestamp_with_tz (
- product_id, customer_id, made_on
- ) VALUES (
- 1, 1, TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'
- );
- INSERT INTO purchases_timestamp_with_tz (
- product_id, customer_id, made_on
- ) VALUES (
- 1, 2, TIMESTAMP '2005-05-13 07:15:31.1234 PST'
- );
下面這個查詢對purchases_timestamp_with_tz表進行檢索:
Sql程式碼
- SELECT *
- FROM purchases_timestamp_with_tz;
- PRODUCT_ID CUSTOMER_ID MADE_ON
- ---------- ----------- ---------------------------------
- 1 1 13-MAY-05 07.15.31.1234 AM -07:00
- 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程式碼
- CREATE TABLE purchases_with_local_tz (
- product_id INTEGER REFERENCES products(product_id),
- customer_id INTEGER REFERENCES customers(customer_id),
- made_on TIMESTAMP(4) WITH LOCAL TIME ZONE
- );
下面這個INSERT語句向purchases_ with_local_tz表中新增一行記錄,並將該行的made_on列值設定為2005-05-13 07:15:30 EST:
Sql程式碼
- INSERT INTO purchases_with_local_tz (
- product_id, customer_id, made_on
- ) VALUES (
- 1, 1, TIMESTAMP '2005-05-13 07:15:30 EST'
- );
雖然made_on列的時間戳設定為2005-05-13 07:15:30 EST,但資料庫中實際儲存的時間戳是2005-05-13 04:15:30(時間戳規格化為PST)。
下面這個查詢對purchases_ with_local_tz表進行檢索:
Sql程式碼
- SELECT *
- FROM purchases_with_local_tz;
- PRODUCT_ID CUSTOMER_ID MADE_ON
- ---------- ----------- --------------------------
- 1 1 13-MAY-05 04.15.30.0000 AM
因為我的資料庫時區和會話時區都是PST,所以此查詢返回的時間戳都是針對PST的。
警告:
前面這個查詢返回的時間戳規格化為PST。如果資料庫時區或會話時區不是PST,則執行查詢時返回的時間戳會有所不同(它將規格化為您的時區)。
如果將當前會話的本地時區設定為EST,並重新執行上面這個查詢,就會看到時間戳被規格化為EST:
Sql程式碼
- ALTER SESSION SET TIME_ZONE = 'EST';
- Session altered.
- SELECT *
- FROM purchases_with_local_tz;
- PRODUCT_ID CUSTOMER_ID MADE_ON
- ---------- ----------- --------------------------
- 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程式碼
- ALTER SESSION SET TIME_ZONE = 'PST';
- ession altered.