在系統設計中,常需在「整數時間戳(INT)」與「日期時間(DATETIME)」之間轉換。MySQL 提供兩個核心函數完美支援此場景,效能極高且無時區困擾(以服務器時區為準)。
| 轉換方向 | 函數 | 語法範例 | 說明 |
|---|---|---|---|
| 日期時間 → 時間戳 | UNIX_TIMESTAMP() | SELECT UNIX_TIMESTAMP('2009-07-16 00:53:00'); |
返回距 1970-01-01 秒數,插入時常用 |
| 時間戳 → 日期時間 | FROM_UNIXTIME() | SELECT FROM_UNIXTIME(1350437720); |
返回 DATETIME 格式,查詢顯示常用 |
| 當前時間 → 時間戳 | UNIX_TIMESTAMP(NOW()) | SELECT UNIX_TIMESTAMP(NOW()); |
獲取當前秒級時間戳 |
CREATE TABLE events (
id INT PRIMARY KEY AUTO_INCREMENT,
event_name VARCHAR(100),
-- 使用 INT 存儲時間戳,節省空間且便於跨語言交互
created_at INT UNSIGNED NOT NULL DEFAULT 0,
updated_at INT UNSIGNED NOT NULL DEFAULT 0
);
-- 方式一:應用層傳入時間戳
INSERT INTO events (event_name, created_at) VALUES ('用戶註冊', 1704067200);
-- 方式二:SQL 現場轉換
INSERT INTO events (event_name, created_at)
VALUES ('訂單創建', UNIX_TIMESTAMP('2024-01-01 12:00:00'));
-- 基礎轉換
SELECT event_name, FROM_UNIXTIME(created_at) AS created_dt FROM events;
-- 格式化輸出
SELECT event_name, DATE_FORMAT(FROM_UNIXTIME(created_at), '%Y-%m-%d %H:%i') AS created_fmt FROM events;
-- 範圍查詢(利用索引優勢)
SELECT * FROM events
WHERE created_at BETWEEN UNIX_TIMESTAMP('2024-01-01') AND UNIX_TIMESTAMP('2024-01-31 23:59:59');
time_zone 系統變量,確保寫入/讀取環境時區一致BIGINT 或原生 DATETIMEDATETIME(3) 或 TIMESTAMP(3)