需求

查询某一天中每个小时的订单数量, 如果某个时间段没有数据, 就填充 0. 效果如下:

建表语句

-- 一张简化过的 xx 订单表
CREATE TABLE `mod_work_order` (`id` int(11) NOT NULL,`create_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

模拟2021年3月22日当天的数据

INSERT INTO `mod_work_order` VALUES (1, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (2, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (3, '2021-03-22 07:26:31');
INSERT INTO `mod_work_order` VALUES (4, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (5, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (6, '2021-03-22 08:26:31');
INSERT INTO `mod_work_order` VALUES (7, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (8, '2021-03-22 14:26:31');
INSERT INTO `mod_work_order` VALUES (9, '2021-03-22 19:26:31');

实现步骤

第一步

一开始很容易就能想到如下的 sql, 就是按小时分组嘛, 然后按时间点排序

SELECT HOUR(create_time) AS order_hour, count(id) AS num
FROM mod_work_order
WHERE create_time >= str_to_date('2021-03-22 00:00:00','%Y-%m-%d %T')    AND create_time <= str_to_date('2021-03-22 23:59:59','%Y-%m-%d %T')
GROUP BY order_hour ORDER BY order_hour;

而且如果你的测试环境刚好有这一天 24 小时的数据的话, 稍微不细心就觉得这样就 ok 了. 但实际上如果一旦哪个时间段没数据, 就会是下面的结果:

第二步

查询时, 构建一张临时表, 里面包含了 24 小时, 作为默认数据.

 SELECT 0 AS order_hour UNION ALL SELECT 1 AS order_hour UNION ALLSELECT 2 AS order_hour UNION ALL SELECT 3 AS order_hour UNION ALL SELECT 4 AS order_hour UNION ALL SELECT 5 AS order_hour UNION ALL SELECT 6 AS order_hour UNION ALL SELECT 7 AS order_hour UNION ALL SELECT 8 AS order_hour UNION ALL SELECT 9 AS order_hour UNION ALL SELECT 10 AS order_hour UNION ALL SELECT 11 AS order_hour UNION ALL SELECT 12 AS order_hour UNION ALL SELECT 13 AS order_hour UNION ALL SELECT 14 AS order_hour UNION ALL SELECT 15 AS order_hour UNION ALL SELECT 16 AS order_hour UNION ALL SELECT 17 AS order_hour UNION ALL SELECT 18 AS order_hour UNION ALL SELECT 19 AS order_hour UNION ALL SELECT 20 AS order_hour UNION ALL SELECT 21 AS order_hour UNION ALL SELECT 22 AS order_hour UNION ALL SELECT 23 AS order_hour

第三步

将第一步和第二步的查询结果, 进行左连接.

select a.order_hour as order_hour, ifnull(b.num, 0) as numfrom 第二步的查询结果 as aLEFT JOIN 第一步的查询结果 as b
ON a.order_hour=b.order_hourORDER BY order_hour;

最终结果

select a.order_hour as order_hour, ifnull(b.num, 0) as num from (SELECT 0 AS order_hour UNION ALL SELECT 1 AS order_hour UNION ALLSELECT 2 AS order_hour UNION ALL SELECT 3 AS order_hour UNION ALL SELECT 4 AS order_hour UNION ALL SELECT 5 AS order_hour UNION ALL SELECT 6 AS order_hour UNION ALL SELECT 7 AS order_hour UNION ALL SELECT 8 AS order_hour UNION ALL SELECT 9 AS order_hour UNION ALL SELECT 10 AS order_hour UNION ALL SELECT 11 AS order_hour UNION ALL SELECT 12 AS order_hour UNION ALL SELECT 13 AS order_hour UNION ALL SELECT 14 AS order_hour UNION ALL SELECT 15 AS order_hour UNION ALL SELECT 16 AS order_hour UNION ALL SELECT 17 AS order_hour UNION ALL SELECT 18 AS order_hour UNION ALL SELECT 19 AS order_hour UNION ALL SELECT 20 AS order_hour UNION ALL SELECT 21 AS order_hour UNION ALL SELECT 22 AS order_hour UNION ALL SELECT 23 AS order_hour
) as aLEFT JOIN (SELECT HOUR(create_time) AS order_hour, count(id) AS num FROM mod_work_order WHERE create_time >= str_to_date('2021-03-22 00:00:00','%Y-%m-%d %T')    AND create_time <= str_to_date('2021-03-22 23:59:59','%Y-%m-%d %T')   GROUP BY order_hour
) b ON a.order_hour=b.order_hourORDER BY order_hour;

mysql 查询一天中每个小时的数据量相关推荐

  1. MYSQL查询大于创建时间一小时的数据

    以下代码中times为时间字段,类型为datetime 1.查询大于times一小时的数据 //大于号后面都是获取times一小时后的时间 select*from table where now() ...

  2. MySQL查询关联表中不存在的数据NOT EXISTS()

    工作中遇到这样的问题,用户表(t_users)中有属性部门id,所有的部门存在部门表(t_org)中. 由于之前的用户数据是执行sql导入的,导入时没有做校验,现在发现有些用户的所属部门id在t_or ...

  3. Mysql 查询一天中每半小时记录的数量

    SELECT HOUR(e.time)as Hour,FLOOR(MINUTE(e.time)/30) as M, COUNT(*) as Count FROM error_log e WHERE e ...

  4. Mysql 查询一天中,每个小时数据的数量

    SELECT HOUR(e.time) as Hour,count(*) as Count FROM error_log e WHERE e.date = '2017-09-02' GROUP BY ...

  5. 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?

    前提这个table有一个日期字段date_time之类的 1.根据数据表中日期字段查询某个月每一天的数据量 如果要获取8月的数据,可以这么写: SELECT count(*), DATE_FORMAT ...

  6. MySQL查询 json 字段中是否包含某个value

    MySQL查询 json 字段中是否包含某个value 方法一: 1.简单版本 :查询json的key SELECT * FROM 表名 where 字段名 -> '$.json中的key' = ...

  7. MySQL查询一个表的前25%的数据

    MySQL查询一个表的前25%的数据,SQL如下: # qianfeng SELECT g.* FROM (SELECT @rownum:=0) r join tb_shopping_car g wh ...

  8. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间

    很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(500) , row ...

  9. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

最新文章

  1. 档案盒正面标签制作_2020昆明大学档案盒价格价格行情
  2. 2个网页跳来跳去_怎么写最优化的网页标题标签(Title Tag)?
  3. asp.net core 腾讯验证码的接入
  4. python视窗编程_[PYTHON] 核心编程笔记(19.图形用户界面编程)
  5. matlab离散傅里叶逆变换,手动实现离散傅里叶正变换与逆变换(程序+例子)
  6. Docker发布镜像至Docker Hub
  7. 《程序是怎样跑起来的》第七章
  8. java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例
  9. windows下一次简单的拖库练习
  10. Android访问assets本地Json文件
  11. PDF识别文字、关键字,获取对应坐标,用于插入电子签名
  12. 配置 Maven 阿里云镜像
  13. 推挽电路原理及应用-上N下P以及下N上P
  14. Faster RCNN代码详解(三):数据处理的整体结构
  15. 这有10款好玩游戏,游戏迷速来围观
  16. 数据库 | MitoPhen 数据库:基于人体表型进行线粒体 DNA 疾病诊断
  17. 自动弹出 微信授权登录窗口
  18. 短信格式(sms)以及编码总结
  19. 《封号码罗》python爬虫之企某科技网站js逆向(十四)
  20. 睡眠经济逆势袭来,传统床品行业如何借势崛起

热门文章

  1. Acwing 77场
  2. 详解shell中的几种标准输出重定向方式
  3. 解决SpringBoot集成Thymeleaf 出现java.lang.ClassNotFoundException: org.unbescape.html.HtmlEscape异常问题
  4. Java实现大数乘法_Java实现大整数乘法
  5. 小米股价大跌推百亿回购,其实业绩能否持续提升才是关键
  6. 移动互联广告传媒介绍
  7. pycharm启动报错
  8. 这9个免费可商用图片素材下载网站,凭什么得到知乎10万+用户推荐!!!
  9. java实现开方运算(牛顿迭代法)
  10. Unity Shader Graph - Colored Ghost