2011-05-13 196 views
5

我正在開發日曆應用程序。它存儲兩種格式的時間。該表格具有以下列title, startDate, startTime。如果用戶提供開始時間加上開始日期。數據庫在startTime列中存儲UNIX時間戳(自UNIX epok以來的秒數),而startDate是NULL。如果用戶僅提供開始日期,則數據庫以nnnn-mm-dd的格式在'startTime`中以startDateNULL存儲日期。我有這個數據庫結構,因爲在世界各地顯示時間更容易,因爲不同的時區有不同的夏令時。SQL語句中的Where語句中的IF語句

我想選擇指定日期之後發生的事件。客戶端計算機爲服務器提供當天開始的UNIX時間戳($unix)和格式爲nnnn-mm-dd的日期($date)以選擇正確的日期。

問題是,我不知道如何選擇那些如上所述發生的日子。這種解決方案並不適用於我,即使它的工作原理:

SELECT * 
    FROM events 
WHERE startDate >= '$date' 
    OR startTime >= '$unix' 

的事情是我有一些行,其中UNIX時間戳在startTime提供,我也有startDate提供的日期和其他原因,我我不想解釋。正因爲如此,我無法使用上面的解決方案。

我需要某種形式的解決方案,它有一個IF語句中Where子句,如:

SELECT * 
    FROM events 
WHERE IF(startTime = NULL, startDate >= '$date', startTime >= '$unix') 

我只是猜測這個解決方案。但是,對嗎?

回答

8
WHERE (startTime IS NULL AND startDate >= '$date') 
    OR (startTime IS NOT NULL AND startTime >= '$unix') 
+0

爲什麼兩個'NULL NULL'? – einstein 2011-05-13 04:32:25

+4

@ Woho87:你永遠不會有足夠的NULL! ;) – 2011-05-13 04:35:21

+0

@ Woho87:沒有兩個空值。在第一次修訂中,但我在10秒後修復了錯字。 – zerkms 2011-05-13 04:35:54

0

你只需要一些合併布爾邏輯WHERE子句中:

SELECT * 
FROM events 
WHERE 
    (startDate IS NULL AND startTime >= '$unix') OR 
    (startTime IS NULL AND startDate >= '$date') 
+0

你確定我們在兩種情況下都需要'IS NULL'嗎?如果是這樣 - 爲什麼不把它移出括號。 – zerkms 2011-05-13 04:37:08

+0

@zerkms:不同的變量......我按照我對海報要求的解釋來做,這些要求可能正確也可能不正確:「數據庫」在startTime列中存儲UNIX時間戳(自UNIX epok以來的秒數)而startDate是NULL。如果用戶僅提供開始日期,則數據庫以startDate格式存儲日期格式爲nnnn-mm-dd,在'startTime'中以NULL格式存儲日期。 – 2011-05-13 04:38:20

+0

呵呵,我試着根據他的'IF'假設來寫我的答案......它代表不同的邏輯:-S – zerkms 2011-05-13 04:41:12

4

所有SQL方言支持CASE WHEN:

SELECT * 
FROM events 
WHERE CASE WHEN startTime is null 
      THEN startDate >= '$date' 
      ELSE startTime >= '$unix' 
+0

這不會被優化爲使用索引。 – zerkms 2011-05-13 04:31:59

0
SELECT * 
FROM events 
WHERE 
    (startDate >= '$date' OR startTime >= '$unix') 
AND 
    startDate != NULL 

這將不返回任何一行對於startDate具有空值

+2

'!= NULL'總是被評估爲'FALSE' – zerkms 2011-05-13 04:34:57

+1

'AND startDate IS NOT NULL'就是你在那裏尋找@Ibu。 – phpguru 2014-05-21 14:36:14

0

我假設你想使用的startDate時的startDate不爲空,並開始時間時,開始時間是不是空...那就試試這個...

 

SELECT * 
FROM events 
WHERE (startTime is not NULL and startDate >= '$date') 
OR (startTime is not NULL and startTime >= '$unix') 

您還可以使用CASE語句,但這更有意義的是更具可讀性。

0

我知道這是一個老問題,但我認爲這是前進的最好方式......

SELECT * 
FROM events 
WHERE IF(startTime IS NULL, '$date', '$unix') =< startDate