我正在尝试选择未到期的*任务。有人说,考虑到我有一个单独的日期和时间列,应该选择超过这个确切日期和时间的任何内容。
目前我正在使用它不选择今天的所有实例:
SELECT * FROM `tasks` WHERE `due_date` >= NOW() AND `due_time` >= NOW()
我无权访问DATETIME字段的数据库。我只能选择。
due_date 的 DATE 类型为 due_time TIME 为类型
答案 0 :(得分:1)
SELECT * FROM `tasks` WHERE `due_date` >= DATE(NOW()) AND `due_time` >= TIME(NOW());
DATE()提取年 - 月 - 日期部分,TIME()提取小时:分钟:秒部分
http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html
答案 1 :(得分:0)
请尝试使用CURDATE()
和CURTIME()
。你应该能够找出那些随你可以使用的逻辑。
此处有更多详情:http://www.w3schools.com/sql/func_now.asp
虽然根据评论,通常理想的做法是将日期时间版本的内容与日期时间进行比较。然后,您可以只进行一次比较并像现在一样使用NOW()
。
答案 2 :(得分: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上的&gt; =条件。)
我相信这是等价的:
SELECT t.* FROM `tasks` t
WHERE t.`due_date` >= DATE(NOW())
AND ( t.`due_date` > DATE(NOW()) OR t.`due_time` >= TIME(NOW()) )