我有表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'
(我不会使用此查询,其他人会这样做。)
答案 0 :(得分:4)
在日期/时间中添加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
上的索引。