Tôi là một người hoàn toàn mới và tôi không thể tìm thấy một cách tốt để làm điều này ở bất cứ đâu. Tôi có một bảng cơ sở dữ liệu chứa số liệu thống kê được ghi lại vào nhiều thời điểm khác nhau trong suốt cả tuần. Tuần báo cáo bắt đầu vào thứ năm. Bảng chứa cột dữ liệu (ngày) lưu trữ khi dữ liệu được ghi.
Tôi cần lấy dữ liệu trong một tuần nhất định (tuần báo cáo bắt đầu vào thứ năm). Tôi đã viết các truy vấn sau đây:
SELECT *
FROM `table`
WHERE 1 = CASE
WHEN WEEKDAY(NOW()) = 0 THEN DATEDIFF(NOW(),`date`) BETWEEN -2 AND 4
WHEN WEEKDAY(NOW()) = 1 THEN DATEDIFF(NOW(),`date`) BETWEEN -1 AND 5
WHEN WEEKDAY(NOW()) = 2 THEN DATEDIFF(NOW(),`date`) BETWEEN -0 AND 6
WHEN WEEKDAY(NOW()) = 3 THEN DATEDIFF(NOW(),`date`) BETWEEN -6 AND 0
WHEN WEEKDAY(NOW()) = 4 THEN DATEDIFF(NOW(),`date`) BETWEEN -5 AND 1
WHEN WEEKDAY(NOW()) = 5 THEN DATEDIFF(NOW(),`date`) BETWEEN -4 AND 2
WHEN WEEKDAY(NOW()) = 6 THEN DATEDIFF(NOW(),`date`) BETWEEN -3 AND 3
END
Điều này dường như để làm việc trên thử nghiệm ban đầu. Nhưng tôi không chắc đó là cách tốt nhất để nói về nó. Tôi không biết nhiều về hiệu suất của MySQL, nhưng sẽ có hơn một trăm nghìn bản ghi để lọc. Truy vấn này sẽ thực sự chậm do số lượng điều kiện được kiểm tra?
Hàm NOW () được sử dụng khi lấy báo cáo mới nhất - tuy nhiên, một số trường hợp tôi sẽ cần làm báo cáo cho các tuần khác - vì vậy tôi sẽ thay thế một ngày khác vào vị trí.
Ngoài ra, thực hiện theo cách này yêu cầu viết lại truy vấn nếu tuần báo cáo thay đổi - giả sử ngày bắt đầu thay đổi thành Thứ Tư.
Tôi không thể sử dụng hàm TUẦN () vì bạn chỉ có thể bắt đầu một tuần trên Mặt trời hoặc Thứ hai với nó.
Bất kỳ ý tưởng để cải thiện truy vấn này được nhiều đánh giá cao!
Ghi chú khác: Hiện đang sử dụng MariaDB 5.3.