MySQL DATE_FORMAT() 函數 (格式化日期時間顯示)
DATE_FORMAT() 是 MySQL 中用來將日期時間值格式化為指定格式的字串的函數。它非常靈活,可以自定義各種日期時間的顯示格式。
DATE_FORMAT() 語法 (Syntax)
DATE_FORMAT(date, format)
- date:要格式化的日期或日期時間值。
- format:格式字串,使用特定的格式說明符。
常用格式說明符
| 格式 | 說明 | 範例值 |
|---|---|---|
| %Y | 四位數年份 | 2024 |
| %y | 兩位數年份 | 24 |
| %m | 月份(兩位數,01-12) | 11 |
| %c | 月份(數字,1-12) | 11 |
| %M | 月份名稱(英文全名) | November |
| %b | 月份名稱(英文縮寫) | Nov |
| %d | 日期(兩位數,01-31) | 22 |
| %e | 日期(數字,1-31) | 22 |
| %D | 日期(帶英文後綴) | 22nd |
| %H | 小時(24 小時制,00-23) | 14 |
| %h | 小時(12 小時制,01-12) | 02 |
| %I | 小時(12 小時制,01-12) | 02 |
| %k | 小時(24 小時制,0-23) | 14 |
| %l | 小時(12 小時制,1-12) | 2 |
| %i | 分鐘(00-59) | 30 |
| %s | 秒(00-59) | 45 |
| %S | 秒(00-59) | 45 |
| %f | 微秒(000000-999999) | 123456 |
| %p | AM 或 PM | PM |
| %r | 12 小時制時間(hh:mm:ss AM/PM) | 02:30:45 PM |
| %T | 24 小時制時間(HH:MM:SS) | 14:30:45 |
| %W | 星期幾(英文全名) | Friday |
| %a | 星期幾(英文縮寫) | Fri |
| %w | 星期幾(數字,0=Sunday) | 5 |
| %j | 一年中的第幾天(001-366) | 327 |
| %U | 一年中的第幾週(00-53,週日為一週開始) | 47 |
| %u | 一年中的第幾週(00-53,週一為一週開始) | 47 |
| %V | ISO 週數(01-53,與 %X 配合) | 47 |
| %X | ISO 年份(與 %V 配合) | 2024 |
| %% | 百分號字元 | % |
DATE_FORMAT() 函數用法範例 (Example)
基本日期格式
SELECT DATE_FORMAT('2024-11-22', '%Y-%m-%d');
-- 結果:2024-11-22
SELECT DATE_FORMAT('2024-11-22', '%Y/%m/%d');
-- 結果:2024/11/22
SELECT DATE_FORMAT('2024-11-22', '%d-%m-%Y');
-- 結果:22-11-2024
完整日期時間格式
SELECT DATE_FORMAT('2024-11-22 14:30:45', '%Y-%m-%d %H:%i:%s');
-- 結果:2024-11-22 14:30:45
SELECT DATE_FORMAT('2024-11-22 14:30:45', '%Y年%m月%d日 %H時%i分%s秒');
-- 結果:2024年11月22日 14時30分45秒
月份和星期的文字顯示
SELECT DATE_FORMAT('2024-11-22', '%W, %M %D, %Y');
-- 結果:Friday, November 22nd, 2024
SELECT DATE_FORMAT('2024-11-22', '%a, %b %d, %Y');
-- 結果:Fri, Nov 22, 2024
12 小時制時間
SELECT DATE_FORMAT('2024-11-22 14:30:45', '%h:%i:%s %p');
-- 結果:02:30:45 PM
SELECT DATE_FORMAT('2024-11-22 09:15:00', '%r');
-- 結果:09:15:00 AM
24 小時制時間
SELECT DATE_FORMAT('2024-11-22 14:30:45', '%H:%i:%s');
-- 結果:14:30:45
SELECT DATE_FORMAT('2024-11-22 14:30:45', '%T');
-- 結果:14:30:45
實際應用範例
格式化訂單日期
SELECT
order_id,
DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date
FROM orders;
| order_id | formatted_date |
|---|---|
| 1 | 2024年11月22日 |
| 2 | 2024年11月23日 |
按年月分組統計
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS year_month,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY year_month;
| year_month | order_count | total_amount |
|---|---|---|
| 2024-10 | 150 | 50000 |
| 2024-11 | 180 | 62000 |
取得月份的第一天和最後一天
SELECT
DATE_FORMAT(NOW(), '%Y-%m-01') AS first_day_of_month,
LAST_DAY(NOW()) AS last_day_of_month;
顯示友善的時間格式
SELECT
activity,
DATE_FORMAT(created_at, '%m/%d %H:%i') AS activity_time
FROM activity_logs
ORDER BY created_at DESC
LIMIT 10;
產生檔案名稱
SELECT CONCAT('backup_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), '.sql') AS backup_filename;
-- 結果:backup_20241122_143045.sql
TIME_FORMAT() 函數
如果只需要格式化時間部分,可以使用 TIME_FORMAT() 函數:
SELECT TIME_FORMAT('14:30:45', '%H:%i');
-- 結果:14:30
SELECT TIME_FORMAT('14:30:45', '%h:%i %p');
-- 結果:02:30 PM
STR_TO_DATE() 函數(反向操作)
STR_TO_DATE() 是 DATE_FORMAT() 的反向操作,用於將字串解析為日期:
SELECT STR_TO_DATE('22-11-2024', '%d-%m-%Y');
-- 結果:2024-11-22
SELECT STR_TO_DATE('November 22, 2024', '%M %d, %Y');
-- 結果:2024-11-22