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

MySQL:从昨天下午3点到今天下午4点的搜索订单,mysql,sql,date,Mysql,Sql,Date,我有订单表,其中存储了订单状态和订单日期的相关数据。我想搜索所有具有指定状态的订单,这些订单是昨天下午3点后到今天下午4点发出的。查询将在上午10点、下午3点、下午5点的不同时间运行。。。不管 例如:如果我今天运行查询2014年5月13日,我希望获得2014-12-05 15:00:00到2015年5月13日16:00:00的所有订单 日期存储格式为:YYYY-MM-DD HH:MM:SS 我得到的是: select * from orders where status = 'new' and

我有订单表,其中存储了订单状态和订单日期的相关数据。我想搜索所有具有指定状态的订单,这些订单是昨天下午3点后到今天下午4点发出的。查询将在上午10点、下午3点、下午5点的不同时间运行。。。不管 例如:如果我今天运行查询2014年5月13日,我希望获得2014-12-05 15:00:00到2015年5月13日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天的间隔时,仍然保留时间组件。将日期用于第一个条件:

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

这种方法的优点是所有函数都移动到当前日期。这将允许MYSQL利用在上创建的索引。

在日期/时间中添加1天的间隔时,仍然保留时间组件。将日期用于第一个条件:

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

这种方法的优点是所有函数都移动到当前日期。这将允许MYSQL利用在上创建的索引。

+1。替代方法是首选方法,首先是因为它更容易理解,其次是为了提高性能。通过在bare created_at列上使用不等式谓词,如果有合适的索引可用,MySQL可以使用高效的索引范围扫描操作,而不必为表中每个翻转的行计算函数。注意:日期添加功能不是必需的。当前_日期+间隔16小时返回一个等效结果。感谢claryfing和提供伟大的新解决方案。我花了一段时间才明白第二个选项的作用,但后来我也意识到它比我的解决方案好得多。再次感谢+1.替代方法是首选方法,首先是因为它更容易理解,其次是为了提高性能。通过在bare created_at列上使用不等式谓词,如果有合适的索引可用,MySQL可以使用高效的索引范围扫描操作,而不必为表中每个翻转的行计算函数。注意:日期添加功能不是必需的。当前_日期+间隔16小时返回一个等效结果。感谢claryfing和提供伟大的新解决方案。我花了一段时间才明白第二个选项的作用,但后来我也意识到它比我的解决方案好得多。再次感谢!