【问题标题】:SQL: Select * WHERE due date and due time after NOW() without DATETIME()SQL:选择 * WHERE 到期日期和 NOW() 之后的到期时间,没有 DATETIME()
【发布时间】:2016-04-22 15:13:43
【问题描述】:

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

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

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

我无权为 DATETIME 字段交替数据库。我只能选择。

due_date 的类型为 DATEdue_time 的类型为 TIME 作为类型

【问题讨论】:

  • 另请注意,您将错过所有迟于今天(按日期)但早于现在(按时间)到期的任务
  • 不是 100% 确定这是重复的,但请参阅 stackoverflow.com/questions/1318630/…

标签: mysql sql date datetime select


【解决方案1】:

要获得您正在寻找的行为,您可以执行以下操作:

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

第一个cut 是与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()) )

【讨论】:

  • 宾果游戏!谢谢你。我可以先按日期再按时间排序吗?
  • 是的,ORDER BY due_date ASC, due_time ASC 应该可以正常工作。
  • 玩排序。我通常发现 DESC 在玩日期时更有用。
  • 我的答案中的原始查询有一个可以删除的冗余条件。修改后的查询添加为后续。
【解决方案2】:
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

【讨论】:

  • 戴夫的回答更简洁,使用他的。
  • 这似乎也不起作用。它选择今天到期,从现在开始
  • 那个>=,试试>
  • 这会错过一些到期的任务(例如明天在到期时间之前)。
  • @spencer7593 我只是想选择所有“活动”任务
【解决方案3】:

尝试改用CURDATE()CURTIME()。您应该能够计算出可供您使用的逻辑。

更多详情:http://www.w3schools.com/sql/func_now.asp

尽管根据 cmets,最好保留要与日期时间进行比较的日期时间版本。然后,您可以像现在一样进行一次比较并使用NOW()

【讨论】:

  • 我也试过 CURDATE() 和 CURTIME()。我得到相同的结果。
  • 我无权访问数据库来替换它(根据我更新的问题所述),只有 SELECT 是我的选择
  • 就您而言,我理解,但许多其他人会阅读此问题/答案以寻找您正在做的事情,他们将有权访问。所以值得一提的是,即使它可能与您的问题没有直接关系。
  • 斯宾塞的答案是我想要的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多