Để chọn các bản ghi có thời gian trong vòng 10 phút tính từ thời điểm hiện tại, bạn dùng hàm DATE_SUB() kết hợp NOW() và INTERVAL.
Cú pháp
SELECT * FROM ten_bang
WHERE ten_cot_thoi_gian >= DATE_SUB(NOW(), INTERVAL 10 MINUTE);
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE users (
Id INT NOT NULL AUTO_INCREMENT,
UserName VARCHAR(20),
UserLastseen DATETIME,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (giả sử thời điểm hiện tại là 2019-01-15 15:02:00)
INSERT INTO users(UserName, UserLastseen) VALUES('Larry', '2019-01-15 02:45:00');
INSERT INTO users(UserName, UserLastseen) VALUES('Sam', NOW());
INSERT INTO users(UserName, UserLastseen) VALUES('Mike', '2019-01-15 02:30:00');
INSERT INTO users(UserName, UserLastseen) VALUES('Bob', '2019-01-15 15:02:00');
INSERT INTO users(UserName, UserLastseen) VALUES('David', '2019-01-15 14:55:00');
3. Xem toàn bộ dữ liệu
SELECT * FROM users;
Kết quả:
+----+----------+---------------------+
| Id | UserName | UserLastseen |
+----+----------+---------------------+
| 1 | Larry | 2019-01-15 02:45:00 |
| 2 | Sam | 2019-01-15 15:01:52 |
| 3 | Mike | 2019-01-15 02:30:00 |
| 4 | Bob | 2019-01-15 15:02:00 |
| 5 | David | 2019-01-15 14:55:00 |
+----+----------+---------------------+
4. Truy vấn: Lấy user hoạt động trong 10 phút gần nhất
SELECT * FROM users
WHERE UserLastseen >= DATE_SUB(NOW(), INTERVAL 10 MINUTE);
Kết quả (giả sử NOW() = 2019-01-15 15:02:00):
+----+----------+---------------------+
| Id | UserName | UserLastseen |
+----+----------+---------------------+
| 2 | Sam | 2019-01-15 15:01:52 |
| 4 | Bob | 2019-01-15 15:02:00 |
| 5 | David | 2019-01-15 14:55:00 |
+----+----------+---------------------+
Các biến thể hữu ích
| Yêu cầu | Cú pháp |
|---|---|
| Trong 1 giờ qua | DATE_SUB(NOW(), INTERVAL 1 HOUR) |
| Trong 1 ngày qua | DATE_SUB(NOW(), INTERVAL 1 DAY) |
| Trong 30 ngày qua | DATE_SUB(NOW(), INTERVAL 30 DAY) |
| Dùng mốc thời gian cụ thể | DATE_SUB('2024-01-15 10:00:00', INTERVAL 10 MINUTE) |
| Chỉ so sánh ngày (bỏ giờ) | DATE(ten_cot) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) |
Lưu ý hiệu năng
- Nên tạo index cho cột thời gian:
CREATE INDEX idx_time ON users(UserLastseen); - Tránh dùng hàm trên cột trong WHERE (ví dụ:
WHERE DATE(UserLastseen) >= ...) vì sẽ không dùng được index - Viết dưới dạng
ten_cot >= DATE_SUB(NOW(), ...)để tận dụng index