Hai hàm cơ bản
| Hàm | Trả về | Ví dụ |
NOW() | DATETIME (ngày + giờ) | 2019-06-02 15:30:39 |
CURDATE() | DATE (chỉ ngày) | 2019-06-02 |
CURTIME() | TIME (chỉ giờ) | 15:30:39 |
Ví dụ minh họa
Lấy datetime hiện tại
mysql> SELECT NOW();
+-----------------------+
| NOW() |
+-----------------------+
| 2019-06-02 15:30:39 |
+-----------------------+
Lấy date hiện tại
mysql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2019-06-02 |
+------------+
Các hàm liên quan
| Hàm | Alias | Trả về | Timezone |
NOW() | CURRENT_TIMESTAMP | DATETIME | Session TZ |
SYSDATE() | - | DATETIME | System TZ (real-time) |
CURDATE() | CURRENT_DATE | DATE | Session TZ |
CURTIME() | CURRENT_TIME | TIME | Session TZ |
UTC_TIMESTAMP() | - | DATETIME | UTC |
UTC_DATE() | - | DATE | UTC |
UTC_TIME() | - | TIME | UTC |
Chuyển đổi
-- DATETIME → DATE
SELECT DATE(NOW()); -- 2019-06-02
SELECT CAST(NOW() AS DATE); -- 2019-06-02
-- DATE → DATETIME (gán 00:00:00)
SELECT CAST(CURDATE() AS DATETIME); -- 2019-06-02 00:00:00
Ứng dụng thực tế
Insert với timestamp tự động
CREATE TABLE logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Query hôm nay
SELECT * FROM orders WHERE DATE(created_at) = CURDATE();
Query 7 ngày qua
SELECT * FROM orders
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Lưu ý Timezone
NOW(), CURDATE() tuân theo @@session.time_zone
SYSDATE() tuân theo system timezone (không đổi bởi SET time_zone)
- TIMESTAMP: Lưu UTC, chuyển về session TZ khi SELECT
- DATETIME: Lưu nguyên giá trị, không chuyển đổi
- Khuyến nghị: Set timezone ở application layer, DB để UTC