SQL:在没有DATETIME()

时间:2016-04-22 15:13:43

标签: mysql sql date datetime select

我正在尝试选择未到期的*任务。有人说,考虑到我有一个单独的日期和时间列,应该选择超过这个确切日期和时间的任何内容。

目前我正在使用它不选择今天的所有实例:

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

我无权访问DATETIME字段的数据库。我只能选择。

due_date DATE 类型为 due_time TIME 为类型

3 个答案:

答案 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()) )