Cú pháp
Sử dụng CONCAT() nối chuỗi rồi CAST() sang DATETIME:
SELECT CAST(CONCAT(cot_ngay, ' ', cot_gio) AS DATETIME) AS ten_alias FROM ten_bang;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE DateAndTimeToTimestamp ( -> Duedate DATE, -> DueTime TIME -> ); Query OK, 0 rows affected (0.51 sec)
2. Chèn dữ liệu
mysql> INSERT INTO DateAndTimeToTimestamp VALUES(DATE_ADD(CURDATE(), INTERVAL 2 DAY), '10:30:02'); Query OK, 1 row affected (0.34 sec) mysql> INSERT INTO DateAndTimeToTimestamp VALUES(DATE_ADD(CURDATE(), INTERVAL -2 DAY), '12:20:45'); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO DateAndTimeToTimestamp VALUES(DATE_ADD(CURDATE(), INTERVAL 1 DAY), '01:32:42'); Query OK, 1 row affected (0.21 sec) mysql> INSERT INTO DateAndTimeToTimestamp VALUES(DATE_ADD(CURDATE(), INTERVAL -1 DAY), '14:25:58'); Query OK, 1 row affected (0.30 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM DateAndTimeToTimestamp;
+------------+----------+ | Duedate | DueTime | +------------+----------+ | 2018-12-16 | 10:30:02 | | 2018-12-12 | 12:20:45 | | 2018-12-15 | 01:32:42 | | 2018-12-13 | 14:25:58 | +------------+----------+ 4 rows in set (0.00 sec)
4. Gộp thành TIMESTAMP
mysql> SELECT CONCAT(Duedate, ' ', DueTime) AS timestampDemo FROM DateAndTimeToTimestamp;
+---------------------+ | timestampDemo | +---------------------+ | 2018-12-16 10:30:02 | | 2018-12-12 12:20:45 | | 2018-12-15 01:32:42 | | 2018-12-13 14:25:58 | +---------------------+ 4 rows in set (0.00 sec)
Phương pháp thay thế
Dùng TIMESTAMP() function (MySQL)
SELECT TIMESTAMP(Duedate, DueTime) AS combined FROM DateAndTimeToTimestamp;
Dùng ADDTIME()
SELECT ADDTIME(Duedate, DueTime) AS combined FROM DateAndTimeToTimestamp;
So sánh các phương pháp
| Phương pháp | Cú pháp | Độ chính xác | Ghi chú |
|---|---|---|---|
| CAST(CONCAT(...)) | CAST(CONCAT(d, ' ', t) AS DATETIME) | Cao | Chuẩn SQL, rõ ràng |
| TIMESTAMP(d, t) | TIMESTAMP(date_col, time_col) | Cao | MySQL specific, ngắn gọn |
| ADDTIME(d, t) | ADDTIME(date_col, time_col) | Cao | Cộng time vào date |
| CONCAT(d, ' ', t) | CONCAT(date_col, ' ', time_col) | Trung bình | Trả về VARCHAR, không phải DATETIME |
Ứng dụng thực tế
Tạo cột DATETIME từ DATE + TIME riêng biệt
ALTER TABLE orders ADD COLUMN created_datetime DATETIME GENERATED ALWAYS AS (TIMESTAMP(order_date, order_time)) STORED;
Truy vấn theo khoảng thời gian chính xác
SELECT * FROM events WHERE TIMESTAMP(event_date, event_time) BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';
Lưu ý
- Kết quả
CONCATlà chuỗi, cầnCASTđể thành DATETIME cho phép so sánh/tính toán - NULL trong bất kỳ cột nào → kết quả NULL
- Dùng
COALESCEnếu cột có thể NULL:CAST(CONCAT(COALESCE(d, CURDATE()), ' ', COALESCE(t, '00:00:00')) AS DATETIME)