2010-06-30 73 views
6

我有一個帶有字段「date_start」和「date_end」的新聞報道的MYSQL表,用於指示在網站上顯示哪條新聞。如果date_start在今天之前,並且date_end尚未經過(今天之後),則文章是公共的。MYSQL:將NULL日期與CURRENT_DATE進行比較

問題: 我想讓管理員離開date_end NULL如果文章是永久性的並且不會過期。當然,這不符合我選擇工作:

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

它留下了一個NULL date_end文章。我嘗試了一下IF語句,但它讓我感到困惑。有沒有一個簡單的方法來做到這一點,或者如果它留空,我應該設置date_end到3000-01-01? :)

回答

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 
19

你可以嘗試:

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

或一些類似的邏輯分組。

+0

感謝球員的驚人快速的回覆!這絕對是我所看到的。這是最後很容易:) – Ville 2010-06-30 13:32:58

+0

:)很高興有幫助。 – 2010-06-30 13:58:56

+0

Upvote for great justice! – SoonDead 2013-04-24 05:49:52

0

,或者嘗試

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

0似乎工作對我蠻好

1

你最後的建議聽起來是正確的。您可以使用IFNULL功能。它有兩個論點。如果第一個參數非空,它將返回第一個參數。第二個參數是如果第一個參數爲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爲您自己設置日曆提醒即可更改您的代碼! :)

+0

我意識到這一點是有點破解,因爲它會顯示在編輯窗體中的網站管理員3000-01-01日期:) – Ville 2010-06-30 13:36:53

+0

因爲IFNULL語句只在WHERE子句,而不是SELECT子句,那麼「3000-01-01」不應該作爲查詢結果返回。至少,這在過去對我很有幫助。 – brentlightsey 2010-06-30 13:44:20