CodeGym /課程 /SQL SELF /日期格式轉換

日期格式轉換

SQL SELF
等級 31, 課堂 3
開放

資料庫世界跟前端世界常常對日期長什麼樣子有不同想法。PostgreSQL 可以存 DATE、TIMESTAMP 或甚至 TIMESTAMPTZ,但這些格式通常不太適合直接給使用者看。像是,預設的 2023-10-01 12:30:45,設計師可能會想看到 2023年10月01日, 12:30 這種格式。有時候還要為報表或 API 特別格式化日期。

要把日期轉成字串或反過來,在 PostgreSQL 裡就靠 TO_CHAR() 跟 TO_DATE() 這兩個 function。

TO_CHAR() function

TO_CHAR() 超好用,想把時間資料變成給人看的字串格式就靠它。你給它一個日期或時間戳,然後指定你想要的格式,它就幫你轉好。

語法

TO_CHAR(value, format)
  • value — 你要轉換的日期或時間戳。
  • format — 你想要日期長什麼樣的格式模板字串。

常見格式範例

格式模板 意思 範例
YYYY 年 2023
MM 月份(01 到 12 的數字) 10
MONTH 月份名稱(全部大寫) OCTOBER
DAY 星期幾(全部大寫) SUNDAY
DD 日期(幾號) 01
HH24 24小時制的時 15
MI 分鐘 45
SS 秒 30

完整格式清單可以看 PostgreSQL 官方文件。

TO_CHAR() 用法範例

報表日期格式化

SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- 結果: '09.10.2023'

12小時制時間顯示

SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- 結果: '03:45 PM'

月份用英文單字顯示

SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- 結果: 'October '

注意:PostgreSQL 會在後面加一個空格。這不是 bug,是 feature!想去掉空格可以用 TRIM():

SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;

自訂格式

SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- 結果: '2023/10/09 15:45:30'

給使用者看的友善格式

SELECT TO_CHAR(NOW(), 'DD "十月" YYYY 年') AS user_friendly_date;
-- 結果: '09 十月 2023 年'

TO_DATE() function

TO_DATE() 則是反過來:它把字串轉成 DATE 型別。這有什麼用?像是使用者輸入 01-10-2023 這種格式,PostgreSQL 要能「看懂」這是什麼日期。

語法

TO_DATE(value, format)
  • value — 包含日期的字串。
  • format — 描述這個字串格式的模板字串。

TO_DATE() 用法範例

字串轉日期

SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- 結果: '2023-10-01'(型別:DATE)

字串日期跟資料表日期比對

假設有個 appointments 資料表,裡面有 appointment_date 欄位(型別 DATE)。使用者輸入日期字串:

SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');

格式錯誤

注意:如果字串格式跟模板不一樣,會出錯!像這樣:

SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- 錯誤:輸入格式不正確

檢查使用者輸入

假設我們要建一個訂單資料表,日期是讓使用者自己輸入:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE
);

-- 插入資料時把字串轉日期
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));

實戰範例

報表格式化。 有個 sales 資料表,sale_date 欄位存的是 TIMESTAMP。要做一個報表,日期要顯示成 DD.MM.YYYY 格式。

-- 範例資料
CREATE TABLE sales (
    sale_id SERIAL PRIMARY KEY,
    sale_date TIMESTAMP
);

INSERT INTO sales (sale_date)
VALUES
    ('2023-10-01 15:30:00'),
    ('2023-10-02 10:15:00'),
    ('2023-10-03 12:45:00');

-- 報表
SELECT sale_id,
       TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;

轉換使用者輸入。 假設使用者輸入的日期格式是 MM/DD/YYYY,要轉成 DATE 存進系統。

INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));

常見錯誤與建議

格式錯誤。最常見的錯誤就是字串格式跟模板不一樣。像使用者輸入 01-10-2023,但你用 MM/DD/YYYY 當模板,PostgreSQL 就會報錯。建議:丟進 SQL 前一定要先驗證使用者輸入。

TO_CHAR() 格式有空格。像 MONTH 這種格式會自動加空格。如果不想要空格,用 TRIM()。

字串解析錯誤。如果字串裡有奇怪的符號或格式,PostgreSQL 會轉不過去。建議:插入資料前可以用 regex 或其他方法多檢查一下。

時間格式用錯。像是你拿 TIMESTAMP 用 DATE 的模板來處理就會怪怪的。建議:記得資料型別要對應你要做的事。

TO_CHAR() 跟 TO_DATE() 這兩個 function 超級實用,讓你可以自訂報表格式、轉換使用者輸入,讓 SQL 查詢更好懂。實務上這些 function 常常用在資料視覺化、報表產生、跟其他系統整合,還有做 UI 給使用者看。

2
任務
SQL SELF, 等級 31, 課堂 3
上鎖
格式化當前日期
格式化當前日期
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION