WHERE
mệnh đề được đặt sai vị trí, nó phải tuân theo các tham chiếu bảng và các hoạt động JOIN.
Một cái gì đó như thế này:
FROM tartikel p1
JOIN tartikelpict p2
ON p1.kArtikel = p2.kArtikel
AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC
CHỈNH SỬA (thêm ba năm sau)
Về cơ bản, phần trên trả lời câu hỏi "Tôi đã cố gắng thêm mệnh đề WHERE vào truy vấn của mình và bây giờ truy vấn trả lại lỗi, làm cách nào để khắc phục nó?"
Đối với câu hỏi về cách viết điều kiện kiểm tra phạm vi ngày "7 ngày qua" ...
Điều đó thực sự phụ thuộc vào việc diễn giải thông số kỹ thuật, kiểu dữ liệu của cột trong bảng là gì (DATE hoặc DATETIME) và dữ liệu nào có sẵn ... những gì sẽ được trả về.
Tóm lại:cách tiếp cận chung là xác định "bắt đầu" cho phạm vi ngày / giờ và "kết thúc" của phạm vi đó và tham chiếu các phạm vi đó trong một truy vấn. Hãy xem xét điều gì đó dễ dàng hơn ... tất cả các hàng cho "ngày hôm qua".
Nếu cột của chúng tôi là loại DATE. Trước khi kết hợp một biểu thức vào một truy vấn, chúng ta có thể kiểm tra nó trong một lệnh SELECT đơn giản
SELECT DATE(NOW()) + INTERVAL -1 DAY
và xác minh kết quả trả về là những gì chúng tôi mong đợi. Sau đó, chúng ta có thể sử dụng cùng một biểu thức đó trong mệnh đề WHERE, so sánh nó với cột DATE như sau:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
Đối với cột DATETIME hoặc TIMESTAMP, chúng ta có thể sử dụng >=
và <
so sánh bất bình đẳng để chỉ định một phạm vi
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
Đối với "7 ngày qua", chúng tôi cần biết liệu điều đó có nghĩa là từ thời điểm này ngay bây giờ, 7 ngày trở lại ... ví dụ:7 * 24 giờ qua, bao gồm cả thành phần thời gian trong so sánh, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
bảy ngày cuối cùng, không bao gồm hôm nay
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
hoặc sáu ngày qua cộng cho đến hôm nay ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Tôi khuyên bạn nên thử nghiệm các biểu thức ở phía bên phải trong câu lệnh SELECT, chúng ta có thể sử dụng một biến do người dùng xác định thay cho NOW () để thử nghiệm, không bị ràng buộc với những gì NOW () trả về để chúng ta có thể kiểm tra các đường biên, qua tuần / tháng ranh giới / năm, v.v.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
Khi chúng ta có các biểu thức trả về giá trị hoạt động cho "bắt đầu" và "kết thúc" cho trường hợp sử dụng cụ thể của chúng ta, nghĩa là "7 ngày qua", chúng ta có thể sử dụng các biểu thức đó trong các so sánh phạm vi trong mệnh đề WHERE.
(Một số nhà phát triển thích sử dụng DATE_ADD
và DATE_SUB
thay cho + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
cú pháp.
Và MySQL cung cấp một số chức năng thuận tiện để làm việc với các kiểu dữ liệu DATE, DATETIME và TIMESTAMP ... DATE, LAST_DAY,
Một số nhà phát triển thích tính toán bắt đầu và kết thúc trong mã khác và cung cấp các ký tự chuỗi trong truy vấn SQL, sao cho truy vấn được gửi đến cơ sở dữ liệu là
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
Và cách tiếp cận đó cũng hoạt động. (Sở thích của tôi là chuyển các ký tự chuỗi đó thành DATETIME một cách rõ ràng, bằng CAST, CONVERT hoặc chỉ với thủ thuật + INTERVAL ...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Tất cả những điều trên đều giả định rằng chúng tôi đang lưu trữ "ngày tháng" ở các kiểu dữ liệu DATE, DATETIME và / hoặc TIMESTAMP thích hợp và không lưu trữ chúng dưới dạng chuỗi ở nhiều định dạng, ví dụ:'dd/mm/yyyy'
, m/d/yyyy
, ngày tháng julian, hoặc ở các định dạng không chính tắc hoặc ở dạng số giây kể từ đầu kỷ nguyên, câu trả lời này sẽ cần dài hơn nhiều.