核心函數對照
| 轉換方向 | 函數 | 範例 | 結果 |
| Unix Timestamp → 日期時間 | FROM_UNIXTIME(ts) | SELECT FROM_UNIXTIME(1156219870); | 2006-10-22 12:31:10 |
| 日期時間 → Unix Timestamp | UNIX_TIMESTAMP(dt) | SELECT UNIX_TIMESTAMP('2006-11-04 12:23:00'); | 1162614180 |
進階用法
1. 格式化輸出
SELECT FROM_UNIXTIME(1156219870, '%Y-%m-%d %H:%i:%s'); -- 自定義格式
SELECT DATE_FORMAT(FROM_UNIXTIME(ts), '%Y-%m-%d'); -- 僅日期部分
2. 當前時間戳獲取
SELECT UNIX_TIMESTAMP(); -- 當前秒級時間戳
SELECT UNIX_TIMESTAMP(NOW()); -- 等價
3. 查詢當天記錄(高效寫法)
-- 避免對欄位用函數導致索引失效
SELECT * FROM message
WHERE chattime >= UNIX_TIMESTAMP(CURDATE())
AND chattime < UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)
ORDER BY id DESC;
-- 原文寫法(會導致全表掃描,不推薦大表使用)
SELECT * FROM message
WHERE DATE_FORMAT(FROM_UNIXTIME(chattime), '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d');
時區注意事項
FROM_UNIXTIME、UNIX_TIMESTAMP 依賴會話 time_zone 系統變數(預設 SYSTEM)。
- 跨時區應用建議:資料庫統一儲存 UTC 時間戳(
SET time_zone = '+00:00'),應用層轉換顯示時區。
TIMESTAMP 欄位自動按會話時區轉換;DATETIME 不轉換,儲存原值。
版本差異提醒
- MySQL 5.6.4+
DATETIME 支援微秒精度(DATETIME(6)),UNIX_TIMESTAMP 回傳整數秒,微秒部分需額外處理。
- 8.0
UNIX_TIMESTAMP() 無參數形式被棄用,建議明確傳入 NOW() 或 CURRENT_TIMESTAMP。