MySQL:搜索从昨天下午 3 点到今天下午 4 点的订单

Posted

技术标签:

【中文标题】MySQL:搜索从昨天下午 3 点到今天下午 4 点的订单【英文标题】:MySQL: search orders made since yesterday 3pm till today 4pm 【发布时间】:2014-05-13 16:58:25 【问题描述】:

我有 ORDERS 表,其中存储了有关订单的状态和订单日期的数据。我想搜索所有具有指定状态的订单,这些订单是昨天下午 3 点后到今天下午 4 点下的。查询将在不同时间运行(上午 10 点、下午 3 点、下午 5 点……无论如何)。 举个例子:如果我今天(13.05.2014)运行查询,我想获取从 2014-12-05 15:00:00 到 13-05-2015 16:00:00 的所有订单

日期存储格式为:YYYY-MM-DD HH:MM:SS

我得到的是:

select *
from orders
where status = 'new'
and (

    (
    date_add(created_at, INTERVAL 1 day) = CURRENT_DATE() 
    and hour(created_at) >= 15
    ) /*1*/

    or (
    date(created_at) = CURRENT_DATE() 
    and hour(created_at) <= 16
    ) /*2*/
)

我只收到今天的订单 - 就像只考虑了第二个条件一样。 我不喜欢使用created &gt;= '2014-05-12 16:00:00'(我不会使用这个查询,其他人会使用)。

【问题讨论】:

【参考方案1】:

当您将 1 天的间隔添加到日期/时间时,您仍然保留时间部分。第一个条件使用date()

where status = 'new' and
      ((date(date_add(created_at, INTERVAL 1 day)) = CURRENT_DATE() and
        hour(created_at) >= 15
       ) /*1*/ or
       (date(created_at) = CURRENT_DATE() and
        hour(created_at) <= 16
       ) /*2*/
      )

另一种方法是:

where status = 'new' and
      (created_at >= date_add(CURRENT_DATE(), interval 15-24 hour) and
       created_at <= date_add(CURRENT_DATE(), interval 16 hour)
      )

这种方法的优点是所有函数都移到了CURRENT_DATE()。这将允许 mysql 利用created_at 上的索引。

【讨论】:

+1。 “替代方法”是首选方法,首先是因为它更容易理解,其次是为了提高性能。使用created_at 裸列上的不等式谓词,MySQL 可以使用有效的索引范围扫描操作(如果有合适的索引可用),而不必为表中的每个翻转行评估函数。注意:不需要 date_add 函数。 CURRENT_DATE() + INTERVAL 16 HOUR 返回等效结果。 感谢您的澄清和提供出色的新解决方案。我花了一段时间才理解第二个选项的作用,但后来我也意识到它比我的解决方案要好得多。再次感谢!

以上是关于MySQL:搜索从昨天下午 3 点到今天下午 4 点的订单的主要内容,如果未能解决你的问题,请参考以下文章

每个时段的 MySQL 查询小计,小时从当天下午 2 点到第二天下午 2 点

从时间戳列表中获取上午 8 点到下午 5 点之间的时间戳

如何从应用程序后台录制视频:Android

随堂小测第19天

早上 7 点到下午 3:30 之间的锻炼时间 - JAVA [关闭]

Oracle 查询排除周末和下午 6 点到晚上 9 点