在 MySQL 中獲取當前日期和時間是非常常見的操作,主要用于數據記錄、時間計算和過濾等場景。MySQL 提供了一系列函數來滿足不同的精度和格式需求。
MySQL 提供了多個函數來獲取當前時間,區別在于返回值的格式和精度:
| 函數 | 返回格式 | 描述 | 示例輸出 |
| `NOW()` | `YYYY-MM-DD HH:MM:SS` | 返回當前的日期和時間(會話時區)。 | `2023-10-27 14:32:05` |
| `CURRENT_TIMESTAMP()` | `YYYY-MM-DD HH:MM:SS` | `NOW()` 的同義詞,功能完全相同。 | `2023-10-27 14:32:05` |
| `CURDATE()` | `YYYY-MM-DD` | 返回當前的日期。 | `2023-10-27` |
| `CURRENT_DATE()` | `YYYY-MM-DD` | `CURDATE()` 的同義詞。 | `2023-10-27` |
| `CURTIME()` | `HH:MM:SS` | 返回當前的時間。 | `14:32:05` |
| `CURRENT_TIME()` | `HH:MM:SS` | `CURTIME()` 的同義詞。 | `14:32:05` |
| `SYSDATE()` | `YYYY-MM-DD HH:MM:SS` | 返回函數執行時的日期時間。 | `2023-10-27 14:32:05` |
| `UTC_DATE()` | `YYYY-MM-DD` | 返回當前的 UTC 日期。 | `2023-10-27` |
| `UTC_TIME()` | `HH:MM:SS` | 返回當前的 UTC 時間。 | `06:32:05` |
| `UTC_TIMESTAMP()` | `YYYY-MM-DD HH:MM:SS` | 返回當前的 UTC 日期和時間。 | `2023-10-27 06:32:05` |
1. 獲取完整的日期和時間 (`NOW()` vs `SYSDATE()`)
`NOW()` 返回語句開始執行時的時間。在一個 SQL 語句中,無論 `NOW()` 被調用多少次,它返回的值都是相同的。
`SYSDATE()` 返回該函數被執行時的精確時間。這意味著在一個語句中多次調用 `SYSDATE()` 會得到不同的值。
SELECT NOW(), SLEEP(2), NOW();
-- 結果:兩個 NOW() 返回的時間完全相同,即使查詢中間睡眠了2秒。
-- | NOW() | SLEEP(2) | NOW() |
-- | 2023-10-27 14:35:01 | 0 | 2023-10-27 14:35:01 |
SELECT SYSDATE(), SLEEP(2), SYSDATE();
-- 結果:兩個 SYSDATE() 返回的時間相差2秒。
-- | SYSDATE() | SLEEP(2) | SYSDATE() |
-- | 2023-10-27 14:35:03 | 0 | 2023-10-27 14:35:05 |
注意: 由于 `SYSDATE()` 的行為可能對復制(Replication)和確定性查詢造成意想不到的影響,通常建議優先使用 `NOW()`。
如果你只需要當前日期或當前時間,可以使用相應的函數。
INSERT INTO orders (product_id, quantity, created_at)
SELECT FROM orders WHERE DATE(created_at) = CURDATE();
SELECT FROM orders WHERE TIME(created_at) > '14:00:00';
`UNIX_TIMESTAMP()` 函數通常用于獲取一個 UNIX 時間戳(自 '1970-01-01 00:00:00' UTC 以來的秒數)。
如果不帶參數調用,它返回當前的 UNIX 時間戳。
如果帶一個日期時間參數,它返回該日期時間對應的 UNIX 時間戳。
SELECT UNIX_TIMESTAMP(); -- 輸出類似:1698411725
SELECT UNIX_TIMESTAMP('2023-10-27 14:32:05'); -- 將指定時間轉換為時間戳
`NOW()`, `CURDATE()` 等函數返回的是當前會話時區的時間。
`UTC_DATE()`, `UTC_TIMESTAMP()` 等函數返回的是 UTC 時間。
SELECT @@system_time_zone, @@session.time_zone;
-- 設置當前會話的時區(例如,設置為東八區 - 北京時間)
SET SESSION time_zone = '+08:00';
假設 MySQL 服務器位于倫敦(UTC時區),而你的會話時區設置為北京時間(UTC+8)。
SET SESSION time_zone = '+08:00';
SELECT NOW(), UTC_TIMESTAMP(), UNIX_TIMESTAMP();
| NOW() | UTC_TIMESTAMP() | UNIX_TIMESTAMP() |
| 2023-10-27 22:00:00 | 2023-10-27 14:00:00 | 1698415200 |
`UNIX_TIMESTAMP()` 不受時區設置影響,它總是基于 UTC。
記錄數據創建/更新時間:在表結構設計中,通常使用 `TIMESTAMP` 或 `DATETIME` 類型的字段,并將其默認值設置為 `CURRENT_TIMESTAMP`(等同于 `NOW()`)。
獲取當前時間:優先使用 `NOW()`,而不是 `SYSDATE()`,除非你有特殊需求。
只需要日期或時間部分:使用 `CURDATE()` 或 `CURTIME()`。
如果你的應用是國際化的,務必注意時區問題。在存儲時間時,可以考慮使用 UTC 時間(`UTC_TIMESTAMP()`)并在應用層根據用戶所在地進行轉換,或者確保會話時區設置正確。
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 使用 DATETIME 類型也可以,但語法略有不同
updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP
另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入?杀镜剡B接LINUX里的MYSQL,簡單便捷?梢源蟠蟮靥岣吖ぷ餍枢。