我有一个MYSQL表,其中包含“date_start”和“date_end”字段的新闻文章,以指示在网站上显示哪些新闻。如果date_start在今天之前并且date_end尚未过去(今天之后),则文章是公开的。
问题: 如果文章具有永久性并且不会过期,我想让管理员将date_end留空。这当然不适合我的选择:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND date_end >= CURRENT_DATE()
它遗漏了NULL date_end
的文章。我尝试用IF语句播放一下,但它让我感到困惑。有没有一种简单的方法可以做到这一点,或者我应该将date_end设置为3000-01-01
如果它是空的? :)
答案 0 :(得分:20)
你可以尝试:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND
(date_end >= CURRENT_DATE() OR date_end IS NULL)
或某些类似的逻辑分组。
答案 1 :(得分:1)
从小问题我得到了你的问题,你想要其中一个
A] date_end超过当前日期或者如果它为空
SELECT * FROM pf_news
WHERE date_start <= CURRENT_DATE() AND (date_end >= CURRENT_DATE() OR date_end is nil )
B] date_end必须存在且超过当前日期
SELECT * FROM pf_news
WHERE date_start <= CURRENT_DATE() AND
date_end >= CURRENT_DATE() AND
date_end is not nil
答案 2 :(得分:1)
您的上一个提案听起来不错。您可以使用IFNULL功能。它有两个论点。如果第一个参数为非null,则返回第一个参数。第二个参数是第一个参数为null时返回的内容。所以在你的陈述中,你可以这样说:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND IFNULL(date_end, '3000-01-01') >= CURRENT_DATE()
这也可以在SQL Server中使用,但是它们称之为“ISNULL”函数。
只需在12/31/2999为自己设置日历提醒即可更改代码! :)
答案 3 :(得分:0)
或尝试
SELECT * FROM pf_news WHERE date_start <= now() AND (date_end >= now() OR date_end = 0)
0似乎对我来说很好
答案 4 :(得分:0)
另一种可能性是使用COALESCE,它返回列表的第一个非null值:
SELECT * FROM pf_news WHERE date_start <= CURRENT_DATE() AND
COALESCE(date_end,'9999-1-1') >= CURRENT_DATE()
因此,如果date_end
为NULL,则在比较中将使用将来的日期'9999-1-1'。
但这将在此日期之后中断:-)