根據 format 字串將日期/時間值格式化為字串。date 可為 DATE、DATETIME、TIMESTAMP、字串或數字。
| 符號 | 說明 | 範例輸出 |
|---|---|---|
| %a | 星期縮寫 (Sun..Sat) | Sun |
| %b | 月份縮寫 (Jan..Dec) | Jan |
| %c | 月份數值 (1..12) | 1 |
| %D | 帶英文後綴的日期 (1st, 2nd, 3rd...) | 1st |
| %d | 日期兩位數 (01..31) | 01 |
| %e | 日期數值 (1..31) | 1 |
| %f | 微秒 (000000..999999) | 123456 |
| %H | 小時 24制兩位數 (00..23) | 14 |
| %h / %I | 小時 12制兩位數 (01..12) | 02 |
| %i | 分鐘兩位數 (00..59) | 30 |
| %j | 一年中的天數 (001..366) | 001 |
| %k | 小時 24制 (0..23) | 14 |
| %l | 小時 12制 (1..12) | 2 |
| %M | 月份全名 (January..December) | January |
| %m | 月份兩位數 (01..12) | 01 |
| %p | AM/PM | PM |
| %r | 時間 12制 (hh:mm:ss AM/PM) | 02:30:45 PM |
| %S / %s | 秒兩位數 (00..59) | 45 |
| %T | 時間 24制 (hh:mm:ss) | 14:30:45 |
| %U | 週數 (00..53),週日為第一天 | 01 |
| %u | 週數 (00..53),週一為第一天 | 01 |
| %V | 週數 (01..53),週日為第一天,配合 %X | 01 |
| %v | 週數 (01..53),週一為第一天,配合 %x | 01 |
| %W | 星期全名 (Sunday..Saturday) | Sunday |
| %w | 星期數值 (0=Sunday..6=Saturday) | 0 |
| %X | 年份四位數,配合 %V(週日為第一天) | 2024 |
| %x | 年份四位數,配合 %v(週一為第一天) | 2024 |
| %Y | 年份四位數 | 2024 |
| %y | 年份兩位數 | 24 |
| %% | 字面 % 字元 | % |
| 需求 | format 字串 | 輸出範例 |
|---|---|---|
| 標準日期 | %Y-%m-%d | 2024-01-15 |
| 標準日期時間 | %Y-%m-%d %H:%i:%s | 2024-01-15 14:30:45 |
| 中文日期 | %Y年%m月%d日 | 2024年01月15日 |
| 年月 | %Y-%m | 2024-01 |
| 月日 | %m-%d | 01-15 |
| 時間 24制 | %H:%i | 14:30 |
| 時間 12制 | %h:%i %p | 02:30 PM |
| ISO 週日期 | %x-%v | 2024-03 |
| 日誌時間戳 | %Y%m%d%H%i%s | 20240115143045 |
SELECT STR_TO_DATE('2024-01-15 14:30:45', '%Y-%m-%d %H:%i:%s');
-- 返回 DATETIME 值
-- 低效:全表掃描 SELECT * FROM orders WHERE DATE_FORMAT(created_at, '%Y-%m') = '2024-01'; -- 高效:範圍查詢走索引 SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
DATE_FORMAT 使用會話時區 (time_zone 系統變數)TIMESTAMP (自動 UTC 轉換) 或應用層統一 UTC 存 DATETIMEDATE_FORMAT 符號豐富,掌握 %Y-%m-%d %H:%i:%s 等常用組合即可覆蓋 95% 場景。切記:WHERE 條件勿用 DATE_FORMAT 包裹欄位,改用範圍查詢利用索引。