2016-04-22 130 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

即> =,尝试> –