在本教學中將學習Oracle DATE
數據類型以及如何有效地處理日期和時間值。
Oracle DATE數據類型簡介
DATE
數據類型允許以一秒的精度存儲包括日期和時間的時間點值。DATE
數據類型存儲年份(包括世紀),月份,日期,小時數,分鐘數和秒數。 它的範圍從西元前4712年1月1日到西元9999年12月31日(共同時代)。 默認情況下,如果未明確使用BCE,則Oracle使用CE日期條目。
Oracle資料庫有其自己的專用格式來存儲日期數據。它使用7
個位元組的固定長度的字段,每個字段對應於世紀,年,月,日,時,分和秒來存儲日期數據。
1. Oracle日期格式
輸入和輸出的標準日期格式是DD-MON-YY
,例如由NLS_DATE_FORMAT
參數的值表示為:01-JAN-17
。
以下語句顯示了NLS_DATE_FORMAT
參數的當前值:
SELECT
value
FROM
V$NLS_PARAMETERS
WHERE
parameter = 'NLS_DATE_FORMAT';
在Oracle資料庫系統中,NLS_DATE_FORMAT
的值是:
DD-MON-RR
以下語句通過使用SYSDATE
函數以標準日期格式返回當前日期。
SELECT
sysdate
FROM
dual;
執行上面查詢語句,得到以下結果 -
假設想要將標準日期格式更改為YYYY-MM-DD
,那麼可以使用ALTER SESSION
語句來更改NLS_DATE_FORMAT
參數的值,如下所示:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
要驗證更改,可以執行顯示當前系統日期的語句:
2. 使用TO_CHAR()函數格式化日期
TO_CHAR()
函數採用DATE
值作為參數,根據指定的格式對其進行格式化,並返回一個日期字串。
例如,要以特定的格式顯示當前的系統日期,請按如下所示使用TO_CHAR()
函數:
SELECT
TO_CHAR( SYSDATE, 'MM/DD/YYYY' )
FROM
dual;
執行上面查詢語句,得到以下結果 -
TO_CHAR()
函數用於顯示月份名稱的語言由NLS_DATE_LANGUAGE
參數控制:
SELECT
value
FROM
V$NLS_PARAMETERS
WHERE
parameter = 'NLS_DATE_LANGUAGE';
執行上面查詢語句,得到以下結果 -
如果要將當前語言更改為另一個語言(例如FRENCH
),請使用ALTER SESSION
語句:
ALTER SESSION SET NLS_DATE_LANGUAGE = 'FRENCH';
-- alter session set nls_language='SIMPLIFIED CHINESE';
現在,可以再次執行TO_CHAR()
函數來查看效果:
正如上面結果所看到的,這個月的名字已經從英文變成了法文。
3. 將字串轉換為日期
由於Oracle使用內部格式來存儲DATE
數據,因此在將日期值存儲到日期列之前,通常必須將字串轉換為日期值。
要轉換不是標準格式的日期值,可以使用帶有格式字串的TO_DATE()
函數。
以下示例使用TO_DATE()
函數將字串“August 01,2017”
轉換為相應的日期:
-- alter session set nls_language='SIMPLIFIED CHINESE';
SELECT
TO_DATE('2018-10-21', 'YYYY-MM-DD' )
FROM
dual;
執行上面查詢語句,得到以下結果 -
2018-10-21
4. 日期文字
除了使用TO_DATE()
函數之外,還可以使用以下語法將日期值指定為字串文字:
DATE 'YYYY-MM-DD'
請注意,要使用日期作為文字,必須使用西曆。 以下示例顯示2017年8月1日的ANSI日期字面值:
DATE '2017-08-01'
ANSI日期文字沒有時間部分,必須採用確切格式('YYYY-MM-DD'
)。 如果要將時間數據包含在日期值中,則必須使用上面介紹的TO_DATE()
函數。
Oracle DATE數據類型示例
以下語句創建一個名為my_events
的表:
CREATE TABLE my_events (
event_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
event_name VARCHAR2 ( 255 ) NOT NULL,
location VARCHAR2 ( 255 ) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
PRIMARY KEY ( event_id )
);
在這個表中,我們有兩列DATE
數據類型,分別是:start_date
和end_date
。
要將新行插入到my_events
表中,請使用以下語句:
INSERT INTO my_events
(event_name,
location,
start_date,
end_date)
VALUES ( 'TechEd Europe',
'Barcelona, Spain',
DATE '2017-11-14',
DATE '2017-11-16' );
在這個例子中,使用INSERT
語句插入了兩個日期文字。可以使用TO_DATE()
函數在插入之前將字串轉換為日期,如下例所示:
INSERT INTO my_events
(event_name,
location,
start_date,
end_date)
VALUES ( 'Oracle OpenWorld',
'San Francisco, CA, USA',
TO_DATE( '2017-10-01', 'YYYY-MM-DD' ),
TO_DATE( '2017-10-05', 'YYYY-MM-DD'));
我們再插入一行進行測試。
INSERT INTO my_events
(event_name,
location,
start_date,
end_date)
VALUES ( 'TechEd US',
'Las Vegas, NV, USA',
DATE '2017-09-25',
DATE '2017-09-29' );
以下查詢返回my_events
表中的所有行:
SELECT
*
FROM
my_events;
執行上面查詢語句,得到以下結果 -
當然,也可以使用TO_CHAR()
函數來格式化事件的日期:
SELECT
event_name,
location,
TO_CHAR(start_data, 'FMmonth DD, YYYY') start_date,
TO_CHAR(end_data, 'FMmonth DD, YYYY') start_date,
FROM
my_events;
執行上面查詢語句,得到以下結果 -
在本教學中,您已經瞭解了Oracle Date數據類型以及如何有效處理Date數據。