PL/SQL - 日期與時間:初學者指南
您好,未來的 PL/SQL 巫師們!今天,我們將踏上一段令人興奮的旅程,探索 PL/SQL 世界中的日期和時間。別擔心如果您之前從未寫過一行代碼——我將成為您親切導遊,我們會一步步來。到了這個教學的結尾,您將能夠像專家一樣處理日期和時間!
理解 PL/SQL 中的日期和時間
在我們深入細節之前,讓我們先討論一下為什麼日期和時間在編程中如此重要。想像一下您正在開發一個生日提醒應用程序或航班預訂系統。您將不斷地與日期打交道!這就是 PL/SQL 的日期和時間函數派上用場的地方。
一節簡短歷史課
您知道 Oracle,這家背後支持 PL/SQL 的公司,從 1970 年代就開始處理日期了嗎?這比大多數閱讀這篇文章的您都要早!在過去的年裡,他們將日期和時間處理精炼得非常精確且靈活。
日期時間和時間間隔數據類型的字段值
讓我們從基礎開始。在 PL/SQL 中,我們有兩個主要類別來處理時間:日期時間(Datetime)和時間間隔(Interval)。
日期時間數據類型
日期時間類型表示一個特定時間點。把他們想像成快照。主要的日期時間類型包括:
- DATE
- TIMESTAMP
- TIMESTAMP WITH TIME ZONE
- TIMESTAMP WITH LOCAL TIME ZONE
時間間隔數據類型
時間間隔類型表示一段時間長度。把他們想像成兩個時間點之間的距離。主要的時間間隔類型包括:
- INTERVAL YEAR TO MONTH
- INTERVAL DAY TO SECOND
讓我們看一下總結這些類型的表格:
數據類型 | 描述 | 範例 |
---|---|---|
DATE | 帶有世紀、年、月、日、時、分、秒的日期 | 01-JAN-2023 12:00:00 |
TIMESTAMP | 日期和時間,包括小數秒 | 01-JAN-2023 12:00:00.000000 |
TIMESTAMP WITH TIME ZONE | 帶時區的時間戳 | 01-JAN-2023 12:00:00.000000 -05:00 |
TIMESTAMP WITH LOCAL TIME ZONE | 相對於會話時區的時間戳 | 01-JAN-2023 12:00:00.000000 |
INTERVAL YEAR TO MONTH | 以年和月為單位的時間段 | INTERVAL '1-3' YEAR TO MONTH |
INTERVAL DAY TO SECOND | 以天、時、分、秒為單位的時間段 | INTERVAL '2 12:30:00' DAY TO SECOND |
日期時間數據類型和函數
現在我們知道了日期時間類型,讓我們學習如何使用它們!
使用 DATE
DATE 類型是最常見的。它存儲世紀、年、月、日、時、分、秒。
讓我們看一些例子:
-- 獲取當前日期
SELECT SYSDATE FROM DUAL;
-- 將當前日期加7天
SELECT SYSDATE + 7 FROM DUAL;
-- 計算兩個日期之間的差異
SELECT TO_DATE('2023-12-31', 'YYYY-MM-DD') - SYSDATE AS days_until_new_year FROM DUAL;
在第一個例子中,我們使用 SYSDATE 獲取當前日期。這就像問您的電腦,“喂,今天星期幾?”
第二個例子展示了日期運算是多麼簡單。我們將今天的日期加7天。想像規劃一個星期的假期——這會非常有用!
第三個例子計算從今天到新年前夜的剩餘天數。我們使用 TO_DATE 將字符串轉換為日期,然後減去今天的日期。
使用 TIMESTAMP
TIMESTAMP 是 DATE 的更精確表親。它包括小數秒,這在您需要追踪到微秒的時間時非常有用。
-- 獲取當前時間戳
SELECT SYSTIMESTAMP FROM DUAL;
-- 將當前時間戳加3小時
SELECT SYSTIMESTAMP + INTERVAL '3' HOUR FROM DUAL;
-- 從時間戳中提取日期部分
SELECT TRUNC(SYSTIMESTAMP) FROM DUAL;
SYSTIMESTAMP 給我們當前日期和時間的微秒精確度。這就像手上帶著一個超級精準的手錶!
第二個例子展示了我們如何將時間間隔加到時間戳上。這在追踪一個過程完成所需時間的情況下可能會很有用。
最後一個例子使用 TRUNC 從時間戳中移除時間部分,給我們只剩日期。當我們只關心日期而不是確切時間時,這很方便。
時間間隔數據類型和函數
間隔非常適合測量時間長度。讓我們看看它在實際中的應用!
INTERVAL YEAR TO MONTH
這種間隔類型非常適合測量較長的時間段,如年齡或合同期限。
-- 計算年齡
SELECT
'John Doe' AS name,
TO_DATE('1990-05-15', 'YYYY-MM-DD') AS birthdate,
SYSDATE AS current_date,
EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM TO_DATE('1990-05-15', 'YYYY-MM-DD'))
|| ' years ' ||
EXTRACT(MONTH FROM SYSDATE) - EXTRACT(MONTH FROM TO_DATE('1990-05-15', 'YYYY-MM-DD'))
|| ' months' AS age
FROM DUAL;
這個例子計算某人的年齡,以年和月為單位。我們使用 EXTRACT 提取日期的年和月部分,然後進行一些簡單的算術運算。這就像魔法——但其實只是巧妙地使用 PL/SQL!
INTERVAL DAY TO SECOND
這種間隔類型非常適合測量較短的時間段,如完成一個任務所需時間。
-- 計算任務持續時間
DECLARE
start_time TIMESTAMP;
end_time TIMESTAMP;
duration INTERVAL DAY TO SECOND;
BEGIN
start_time := SYSTIMESTAMP;
-- 模擬一個需要花費一些時間的任務
DBMS_SESSION.SLEEP(5);
end_time := SYSTIMESTAMP;
duration := end_time - start_time;
DBMS_OUTPUT.PUT_LINE('Task duration: ' || duration);
END;
/
在這個例子中,我們正在測量一個任務的持續時間。我們記錄開始時間,執行某项操作(在這裡,我們只是使用 DBMS_SESSION.SLEEP 等待5秒),然後記錄結束時間。兩者之差給我們任務的持續時間。
結論
恭喜您!您剛剛踏入了 PL/SQL 中日期和時間的世界。我們已經介紹了基本數據類型,看到了如何使用日期和時間戳,甚至還嘗試了間隔。
記住,熟能生巧。嘗試著玩轉這些例子,修改它們,看看會發生什麼。在您意識到之前,您將能像有經驗的程序员一樣處理日期和時間!
繼續編程,持續學習,最重要的是,玩得開心!畢竟,當您在 PL/SQL 中玩得開心時,時間會飛逝!?
Credits: Image by storyset