文章

PostgreSQL - 第 19 天 - 日期與時間處理

課程簡介

日期與時間是許多數據庫應用中不可或缺的部分,例如記錄交易時間、計算時間差等。PostgreSQL 支援多種日期與時間資料類型和強大的函數,幫助我們靈活地操作時間數據。


日期與時間資料類型

1. DATE

儲存日期(年、月、日),不包含時間。

1
2
3
4
CREATE TABLE events (
    event_id SERIAL PRIMARY KEY,
    event_date DATE
);

2. TIME

儲存時間(小時、分鐘、秒),不包含日期。

1
2
3
4
5
CREATE TABLE work_hours (
    employee_id SERIAL PRIMARY KEY,
    start_time TIME,
    end_time TIME
);

3. TIMESTAMP

儲存日期和時間(年、月、日、時、分、秒),不包含時區。

1
2
3
4
CREATE TABLE transactions (
    transaction_id SERIAL PRIMARY KEY,
    transaction_time TIMESTAMP
);

4. TIMESTAMPTZ

儲存日期和時間(包含時區資訊),適用於跨時區應用。

1
2
3
4
CREATE TABLE global_events (
    event_id SERIAL PRIMARY KEY,
    event_time TIMESTAMPTZ
);

插入日期與時間資料

插入日期與時間資料時,可以使用字串格式,PostgreSQL 會自動解析並轉換。

1
2
3
4
INSERT INTO events (event_date) VALUES ('2024-11-08');
INSERT INTO work_hours (start_time, end_time) VALUES ('09:00', '17:00');
INSERT INTO transactions (transaction_time) VALUES ('2024-11-08 15:30:00');
INSERT INTO global_events (event_time) VALUES ('2024-11-08 15:30:00+00');

日期與時間函數

1. NOW() - 獲取當前日期與時間

NOW() 函數返回當前的日期與時間(含時區)。

1
SELECT NOW() AS 當前時間;

2. CURRENT_DATECURRENT_TIME

  • CURRENT_DATE:返回當前日期,不包含時間。
  • CURRENT_TIME:返回當前時間,不包含日期。
1
SELECT CURRENT_DATE AS 今天日期, CURRENT_TIME AS 現在時間;

日期與時間的算術運算

1. 日期加減

可以直接使用 +- 進行日期加減運算。

1
2
SELECT '2024-11-08'::DATE + INTERVAL '10 days' AS 10;
SELECT '2024-11-08'::DATE - INTERVAL '5 days' AS 5;

2. 計算兩個日期間的差異

可以使用 AGE 函數計算兩個日期或時間間的差異。

1
SELECT AGE('2024-11-08', '2024-01-01') AS 日期差異;

提取日期與時間的部分內容

可以使用 EXTRACT 函數提取日期或時間的特定部分(如年、月、日、時、分、秒)。

1
2
3
SELECT EXTRACT(YEAR FROM '2024-11-08'::DATE) AS ,
       EXTRACT(MONTH FROM '2024-11-08'::DATE) AS ,
       EXTRACT(DAY FROM '2024-11-08'::DATE) AS ;

日期格式化

TO_CHAR - 格式化日期和時間

TO_CHAR 函數可以將日期或時間格式化為指定的字串格式。

1
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS') AS 格式化時間;

常見格式化代碼

  • YYYY:四位數年份
  • MM:月份(01-12)
  • DD:日(01-31)
  • HH24:24 小時制小時
  • MI:分鐘
  • SS:秒

常見日期與時間操作範例

1. 查詢某日期範圍內的記錄

1
2
SELECT * FROM transactions
WHERE transaction_time BETWEEN '2024-01-01' AND '2024-12-31';

2. 計算年齡

1
SELECT AGE('2024-11-08', '1990-05-20') AS 年齡;

此範例計算從 1990-05-202024-11-08 的年齡。

3. 每月資料統計

1
2
3
4
SELECT DATE_TRUNC('month', transaction_time) AS 月份, COUNT(*) AS 交易數量
FROM transactions
GROUP BY 月份
ORDER BY 月份;

此範例使用 DATE_TRUNC 函數按月匯總交易數量。


本日總結

今天我們學習了 PostgreSQL 中的日期與時間處理,涵蓋了日期與時間的資料類型、函數、算術運算、格式化等。這些技巧對於操作和分析時間數據非常實用。明天我們將探討 PostgreSQL 中的進階查詢優化技術。

本文章以 CC BY 4.0 授權