Nếu bạn chỉ chọn theo ngày, hãy tính toán dựa trên CURDATE
(chỉ trả về ngày tháng) thay vì NOW
(trả về ngày và giờ). Những ví dụ này sẽ bắt kịp mọi thời điểm trong phạm vi ngày:
- Hôm nay:
WHERE timestamp >= CURDATE()
- Hôm qua:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Tháng này:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Giữa hai ngày 3 tháng 6 năm 2013 và ngày 7 tháng 6 năm 2013 (lưu ý cách ngày kết thúc được chỉ định là ngày 8 tháng 6 chứ không phải ngày 7 tháng 6):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
"Tuần này" phụ thuộc vào ngày bạn bắt đầu tuần của mình; Tôi sẽ để lại điều đó cho bạn. Bạn có thể sử dụng DAYOFWEEK
hàm điều chỉnh CURDATE()
đến phạm vi thích hợp.
Phụ lục :Loại cột của OP là INTEGER
, lưu trữ dấu thời gian UNIX và câu trả lời của tôi giả định loại cột là TIMESTAMP
. Dưới đây là cách thực hiện tất cả những điều tương tự với giá trị dấu thời gian UNIX và vẫn duy trì tối ưu hóa nếu cột được lập chỉ mục (như các câu trả lời ở trên sẽ thực hiện nếu TIMESTAMP
cột được lập chỉ mục) ...
Về cơ bản, giải pháp là chỉ đặt ngày bắt đầu và / hoặc kết thúc trong UNIX_TIMESTAMP
chức năng:
- Hôm nay:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Hôm qua:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Tháng này:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Giữa hai ngày 3 tháng 6 năm 2013 và ngày 7 tháng 6 năm 2013 (lưu ý cách ngày kết thúc được chỉ định là ngày 8 tháng 6 chứ không phải ngày 7 tháng 6):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')