PL/SQL - 日期與時間:初學者指南

您好,未來的 PL/SQL 巫師們!今天,我們將踏上一段令人興奮的旅程,探索 PL/SQL 世界中的日期和時間。別擔心如果您之前從未寫過一行代碼——我將成為您親切導遊,我們會一步步來。到了這個教學的結尾,您將能夠像專家一樣處理日期和時間!

PL/SQL - Date & Time

理解 PL/SQL 中的日期和時間

在我們深入細節之前,讓我們先討論一下為什麼日期和時間在編程中如此重要。想像一下您正在開發一個生日提醒應用程序或航班預訂系統。您將不斷地與日期打交道!這就是 PL/SQL 的日期和時間函數派上用場的地方。

一節簡短歷史課

您知道 Oracle,這家背後支持 PL/SQL 的公司,從 1970 年代就開始處理日期了嗎?這比大多數閱讀這篇文章的您都要早!在過去的年裡,他們將日期和時間處理精炼得非常精確且靈活。

日期時間和時間間隔數據類型的字段值

讓我們從基礎開始。在 PL/SQL 中,我們有兩個主要類別來處理時間:日期時間(Datetime)和時間間隔(Interval)。

日期時間數據類型

日期時間類型表示一個特定時間點。把他們想像成快照。主要的日期時間類型包括:

  1. DATE
  2. TIMESTAMP
  3. TIMESTAMP WITH TIME ZONE
  4. TIMESTAMP WITH LOCAL TIME ZONE

時間間隔數據類型

時間間隔類型表示一段時間長度。把他們想像成兩個時間點之間的距離。主要的時間間隔類型包括:

  1. INTERVAL YEAR TO MONTH
  2. 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