在本教學中將學習Oracle TIMESTAMP
數據類型以及如何在Oracle資料庫中有效處理TIMESTAMP
數據。
Oracle TIMESTAMP數據類型簡介
TIMESTAMP
數據類型用於存儲日期和時間數據,包括年,月,日,時,分和秒。
另外,它存儲小數秒,它不是由DATE數據類型存儲的。
要定義TIMESTAMP
列,請使用以下語法:
column_name TIMESTAMP[(fractional_seconds_precision)]
fractional_seconds_precision
指定SECOND
字段小數部分的位數。它的範圍從0
到9
,這意味著可以使用TIMESTAMP
數據類型來存儲到納秒的精度。
如果省略fractional_seconds_precision
,則默認為6
。
以下運算式說明了如何定義TIMESTAMP
列:
...
started_at TMESTAMP(2),
...
在此示例中,started_at
列是一個TIMESTAMP
列,其分數秒精度設置為微秒。
Oracle TIMESTAMP文字
要指定TIMESTAMP
文字,請使用以下格式:
TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF'
以下示例說明了TIMESTAMP
文字:
TIMESTAMP '1999-12-31 23:59:59.10'
有關如何構造格式字串的詳細資訊,請查看Oracle日期格式。
Oracle TIMESTAMP示例
首先,創建一個名為logs
的新表,其中包含一個TIMESTAMP
列用於演示。
CREATE TABLE logs (
log_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
message VARCHAR(2) NOT NULL,
logged_at TIMESTAMP (2) NOT NULL,
PRIMARY KEY (log_id)
);
其次,將新行插入到logs
表中:
INSERT INTO logs (
message,
logged_at
)
VALUES (
'Invalid username/password for root user',
LOCALTIMESTAMP(2)
);
INSERT INTO logs (
message,
logged_at
)
VALUES (
'User root logged in successfully',
LOCALTIMESTAMP(2)
);
在這個例子中,使用LOCALTIMESTAMP(2)
函數中得到當前的本地時間戳,其精確度秒為微秒,並將該值插入到logs
表的logs_at
列中。
第三,從日誌表中查詢TIMESTAMP數據:
SELECT log_id,
message,
logged_at
FROM logs;
執行上面查詢語句,得到下麵結果 -
格式化TIMESTAMP值
要更改TIMESTAMP
值的輸出,可以使用TO_CHAR()
函數,將TIMESTAMP
值或列的名稱作為第一個參數,將格式字串作為第二個參數。
以下語句使用TO_CHAR()
函數來格式化logged_at
列中的值:
SELECT message,
TO_CHAR(logged_at, 'MONTH DD, YYYY "at" HH24:MI')
FROM logs;
執行上面查詢語句,得到下麵結果 -
提取TIMESTAMP組件
要提取TIMESTAMP
組件(如年,月,日,小時,分鐘和秒),請使用EXTRACT()
函數:
EXTRACT( component FROM timestamp);
如以下面的語句示例:
SELECT
message,
EXTRACT(year FROM logged_at) year,
EXTRACT(month FROM logged_at) month,
EXTRACT(day FROM logged_at) day,
EXTRACT(hour FROM logged_at) hour,
EXTRACT(minute FROM logged_at) minute,
EXTRACT(second FROM logged_at) second
FROM
logs;
注意到NLS_DATE_LANGUAGE
參數決定日期名稱(Thursday),月份名稱(August)以及TIMESTAMP
縮寫(THU
,AUG
)的語言。
默認的TIMESTAMP格式
當字元類型的值被轉換為TIMESTAMP
數據類型時,Oracle使用NLS_TIMESTAMP_FORMAT
參數來控制默認時間戳格式。
以下語句返回Oracle資料庫系統中當前的默認時間戳格式:
SELECT
value
FROM
V$NLS_PARAMETERS
WHERE
parameter = 'NLS_TIMESTAMP_FORMAT';
執行上面查詢語句,將得到以下結果 -
DD-MON-RR HH.MI.SSXFF AM
例如,假設要將新行以logs_attane
值插入到logs
表中,則使用TO_TIMESTAMP()
函數將字串轉換為TIMESTAMP
值,如下所示:
INSERT INTO logs (
message,
logged_at
)
VALUES (
'Test default Oracle timestamp format',
TO_TIMESTAMP('03-AUG-17 11:20:30.45 AM')
);
請注意,時間戳值 - '03-AUG-17 11:20:30.45 AM'
遵循標準時間戳格式。
下麵來驗證結果:
SELECT
log_id, message, logged_at
FROM
logs;
執行上面示例代碼,得到以下結果 -
如果想使用其他時間戳格式而不是默認格式,則可以使用ALTER SESSION SET
語句來執行此操作。
在本教學中,您已經瞭解了Oracle TIMESTAMP
數據類型以及如何有效地處理時間戳。