2016-04-22 72 views
0

我試圖選擇*未到期的任務。這就是說,任何超過這個確切日期和時間應考慮到我有一個單獨的日期和時間列應選擇。SQL:在NOW()沒有DATETIME()後選擇* WHERE截止日期和到期時間()

目前我使用這個地方選擇今天的所有實例:

SELECT * FROM `tasks` WHERE `due_date` >= NOW() AND `due_time` >= NOW() 

我在交替數據庫的時間字段的訪問權限。我只能選擇。

DUE_DATEDATE類型和DUE_TIMETIME類型

+1

爲什麼不只是存儲的截止日期爲'datetime'列,並保存這些麻煩? – Mureinik

+0

這兩個字段的數據類型是什麼? –

+0

而「due_date」和「due_time」列的*數據類型*是......? (這是一個問題,還是狀態報告?) – spencer7593

回答

0

爲了得到它好像你正在尋找的行爲因爲,你可以這樣做:

SELECT t.* FROM `tasks` t 
    WHERE t.`due_date` >= DATE(NOW()) 
    AND ( (t.`due_date` = DATE(NOW()) AND t.`due_time` >= TIME(NOW())) 
     OR (t.`due_date` > DATE(NOW())) 
     ) 

第一次是與due_date進行比較,即所有今天或晚些時候到期的任務。這包括太多,我們需要擺脫今天到期但在當前時間之前的任務。

還有其他的查詢方法可能看起來「更簡單」。上面的方法將謂詞保留在裸列上,所以MySQL可以在適當的索引上有效地使用範圍掃描操作。

隨訪

我做這種類型的查詢之前,用在關鍵的多列分頁。有些東西讓我對這個原始查詢感到困擾,它的條件比真正需要的要多。 (什麼扔我是在DUE_TIME的> =條件。)

我相信這是等價的:

SELECT t.* FROM `tasks` t 
    WHERE t.`due_date` >= DATE(NOW()) 
    AND (t.`due_date` > DATE(NOW()) OR t.`due_time` >= TIME(NOW())) 
+0

Bingo!謝謝。我可以先按日期排序,然後按時間排序嗎? – jQuerybeast

+0

也發現了排序。謝謝 – jQuerybeast

+1

是的,'ORDER BY due_date ASC,due_time ASC'應該可以正常工作。 – spencer7593

0

嘗試使用CURDATE()CURTIME()代替。你應該能夠制定出可供你使用的邏輯。

更多細節在這裏:http://www.w3schools.com/sql/func_now.asp

雖然每次的評論,它通常是理想的保持要比較對日期時間的東西日期時間版本。然後,您可以只進行一次比較,然後像現在一樣使用NOW()

+0

我也嘗試過CURDATE()和CURTIME()。我得到相同的結果。 – jQuerybeast

+0

我無法訪問數據庫來替換它(根據我的更新問題所述),只有SELECT是我的選擇 – jQuerybeast

+0

就我而言,我瞭解,但很多其他人都會閱讀此問題/答案以搜索如何做你正在做的事情,他們將有權訪問。所以值得一提的是,儘管它可能與你的問題沒有直接關係。 – Dave

1
SELECT * FROM `tasks` WHERE `due_date` >= DATE(NOW()) AND `due_time` >= TIME(NOW()); 

DATE()中提取年 - 月 - 日部分和時間()小時:分鐘:秒部分

http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

+1

戴夫的答案更清潔,用他的。 –

+0

這似乎也沒有工作。它選擇今天到期,從現在開始 – jQuerybeast

+0

即> =,嘗試> –

相關問題