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 >= '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 点