當前日期時間取得
| 函數 | 回傳型別 | 範例輸出 | 說明 |
NOW() / SYSDATE() | DATETIME | 2024-01-15 14:30:45 | NOW() 為語句執行開始時間,SYSDATE() 為函數執行瞬間時間 |
CURDATE() / CURRENT_DATE() | DATE | 2024-01-15 | 僅日期部分 |
CURTIME() / CURRENT_TIME() | TIME | 14:30:45 | 僅時間部分 |
UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP() | 對應型別 | ... | UTC 時間,跨時區應用必備 |
日期元件提取函數
SELECT
YEAR(CURDATE()) AS Year, -- 2024
MONTH(CURDATE()) AS Month, -- 1
DAY(CURDATE()) AS Day, -- 15
DAYOFMONTH(CURDATE()) AS DayOfMonth, -- 15 (同 DAY)
DAYOFWEEK(CURDATE()) AS DayOfWeek, -- 2 (1=Sunday)
DAYOFYEAR(CURDATE()) AS DayOfYear, -- 15
WEEK(CURDATE()) AS Week, -- 3
MONTHNAME(CURDATE()) AS MonthName, -- January
QUARTER(CURDATE()) AS Quarter; -- 1
格式化輸出:DATE_FORMAT (最強大、最常用)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2024-01-15 14:30:45 (標準日期時間)
SELECT DATE_FORMAT(NOW(), '%Y%m%d'); -- 20240115 (檔名/分區鍵)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2024-01-15
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 14:30:45
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y'); -- Monday, January 15, 2024
SELECT DATE_FORMAT(NOW(), '%r'); -- 02:30:45 PM (12小時制)
常用格式符號速查
| 符號 | 含義 | 範例 |
| %Y | 4 位數年份 | 2024 |
| %y | 2 位數年份 | 24 |
| %m | 月份 (01-12) | 01 |
| %c | 月份 (1-12) | 1 |
| %d | 日期 (01-31) | 15 |
| %e | 日期 (1-31) | 15 |
| %H | 小時 24制 (00-23) | 14 |
| %h / %I | 小時 12制 (01-12) | 02 |
| %i | 分鐘 (00-59) | 30 |
| %s / %S | 秒 (00-59) | 45 |
| %p | AM/PM | PM |
| %W | 星期名稱 | Monday |
| %a | 星期縮寫 | Mon |
| %M | 月份名稱 | January |
| %b | 月份縮寫 | Jan |
| %j | 年間天數 (001-366) | 015 |
| %U | 週數 (00-53, Sunday first) | 03 |
| %u | 週數 (00-53, Monday first) | 03 |
日期運算與邊界計算
-- 日期加減
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY); -- 明天
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH); -- 上個月同一天
SELECT CURDATE() + INTERVAL 7 DAY; -- 簡寫 (僅 DATE/DATETIME)
-- 當月第一天 / 最後一天
SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01'); -- 2024-01-01
SELECT LAST_DAY(CURDATE()); -- 2024-01-31
-- 當週一 / 週日
SELECT DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE())) DAY); -- 本週一
SELECT DATE_ADD(CURDATE(), INTERVAL (6 - WEEKDAY(CURDATE())) DAY); -- 本週日
時區處理
-- 會話級時區
SET time_zone = '+08:00'; -- 或 'Asia/Taipei' (需載入時區表 mysql_tzinfo_to_sql)
-- 轉換時區
SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00'); -- UTC 轉台北時間
效能建議
- **WHERE 條件避免函數包裹欄位**:`WHERE DATE(created_at) = CURDATE()` → 索引失效。
改寫:`WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY)`。
- 大量資料格式化輸出建議在**應用層**處理,減輕資料庫 CPU。