MySQL特定时间范围查询:查询昨日8点至今日8点插入的行数据
订单时段统计定时任务实现方案
需求说明
- 统计范围:
order表中前一日上午8点至当日上午8点区间内插入的行数据 - 执行方式:每日自动运行的cron任务
- 处理逻辑:统计该时段插入的订单总数量,写入另一张统计结果表
- 关联业务表:order表,表结构参考如下:

实现步骤
1. 核心查询SQL(MySQL版示例)
假设order表的插入时间字段为create_time,可根据实际字段名替换:
SELECT COUNT(*) AS period_order_count FROM `order` WHERE create_time >= CONCAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), ' 08:00:00') AND create_time < CONCAT(CURDATE(), ' 08:00:00');
说明:使用
<而非<=匹配结束时间,避免8点整插入的订单被重复统计到两个时段的结果中。
其他数据库可调整对应时间函数,比如PostgreSQL的时间条件可以写为:WHERE create_time >= (CURRENT_DATE - INTERVAL '1 day') + INTERVAL '8 hour' AND create_time < CURRENT_DATE + INTERVAL '8 hour'
2. 写入统计结果表
假设统计结果表名为order_daily_stat,包含统计日期stat_date、时段订单量order_count、统计开始时间start_time、统计结束时间end_time四个字段,可直接用INSERT+SELECT语句一步完成统计+写入:
INSERT INTO order_daily_stat (stat_date, order_count, start_time, end_time) SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS stat_date, COUNT(*) AS order_count, CONCAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), ' 08:00:00') AS start_time, CONCAT(CURDATE(), ' 08:00:00') AS end_time FROM `order` WHERE create_time >= CONCAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), ' 08:00:00') AND create_time < CONCAT(CURDATE(), ' 08:00:00');
3. cron任务配置
建议设置为每日上午8点05分执行,预留缓冲时间避免8点整的增量数据还未写入完成导致统计漏数,cron表达式如下:
5 8 * * * /usr/bin/mysql -u你的数据库用户名 -p'你的数据库密码' 你的业务库名 -e "上面的INSERT语句" >> /var/log/order_stat_cron.log 2>&1
注意:生产环境不要明文写密码,可以配置MySQL的免密登录文件,避免密码泄露。
内容的提问来源于stack exchange,提问作者mulikevs
相关产品推荐
相关产品推荐

