2010-06-30 43 views
6

Tôi có bảng MYSQL với các bài viết tin tức có các trường "date_start" và "date_end" để cho biết tin tức nào sẽ hiển thị trên trang web. Các bài báo được công khai nếu date_start là trước ngày hôm nay và date_end đã không đi qua (sau ngày hôm nay).MYSQL: so sánh ngày NULL với CURRENT_DATE

Vấn đề: Tôi muốn cho phép quản trị viên rời date_end NULL nếu bài viết có tính chất vĩnh viễn và không hết hạn. Điều này tất nhiên không hoạt động với lựa chọn của tôi:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND date_end >= CURRENT_DATE() 

Nó để lại các bài viết với NULL date_end. Tôi đã thử chơi một chút với các câu lệnh IF nhưng nó gây nhầm lẫn cho tôi. Có cách nào đơn giản để thực hiện việc này hay tôi chỉ cần đặt date_end thành 3000-01-01 nếu nó bị để trống? :)

Trả lời

1

Từ nhỏ tôi đã nhận câu hỏi của bạn, bạn muốn một trong này

A] DATE_END hơn ngày hiện tại hoặc nếu nó là null

SELECT * FROM pf_news 
     WHERE date_start <= CURRENT_DATE() AND (date_end >= CURRENT_DATE() OR date_end is nil) 

B] DATE_END phải có mặt và hơn hiện ngày

SELECT * FROM pf_news 
     WHERE date_start <= CURRENT_DATE() AND 
       date_end >= CURRENT_DATE() AND 
       date_end is not nil 
19

Bạn có thể thử:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND 
(date_end >= CURRENT_DATE() OR date_end IS NULL) 

hoặc một số nhóm lôgic tương tự.

+0

Cảm ơn các bạn vì đã trả lời nhanh chóng! Điều này hoàn toàn là những gì tôi đang tìm kiếm. Nó đã được cuối cùng khá dễ dàng :) – Ville

+0

:) Vui mừng được giúp đỡ. –

+0

Upvote cho công lý tuyệt vời! – SoonDead

0

hoặc thử

SELECT * FROM pf_news WHERE date_start <= now() AND (date_end >= now() OR date_end = 0) 

0 dường như chỉ làm việc tốt cho tôi

1

đề nghị cuối cùng của bạn nghe có vẻ đúng. Bạn có thể sử dụng hàm IFNULL. Nó có hai đối số. Nếu đối số đầu tiên là không null, nó trả về đối số đầu tiên. Đối số thứ hai là những gì cần trả về nếu đối số đầu tiên là null. Vì vậy, trong tuyên bố của bạn, bạn có thể nói điều này:

SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND IFNULL(date_end, '3000-01-01') >= CURRENT_DATE() 

Điều này cũng có thể được sử dụng trong SQL Server, nhưng chúng gọi đó là hàm "ISNULL".

Chỉ cần đặt lời nhắc lịch cho chính bạn vào ngày 31/12/2999 để thay đổi mã của bạn! :)

+0

Tôi nhận ra điều này là một chút của một hack vì nó sẽ hiển thị các trang web quản trị ngày 3000-01-01 trong các hình thức chỉnh sửa :) – Ville

+0

Bởi vì IFNULL tuyên bố chỉ trong mệnh đề WHERE thay cho mệnh đề SELECT, sau đó '3000-01-01' không bao giờ được trả lại dưới dạng kết quả truy vấn. Ít nhất, điều này đã làm việc tốt cho tôi trong quá khứ. – brentlightsey