博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql生成日期的辅助表
阅读量:4575 次
发布时间:2019-06-08

本文共 2363 字,大约阅读时间需要 7 分钟。

为了解决mysql按日期分组查询统计的时候,没有数据补0。可以生成连续的时间表格来辅助查询 * 生成按天的数据

* 每一个小时为一个分段 生成如下辅助表 *代码如下
CREATE TABLE num ( i INT );-- 创建一个表用来储存0-9的数字INSERT INTO num ( i )VALUES    ( 0 ),    ( 1 ),    ( 2 ),    ( 3 ),    ( 4 ),    ( 5 ),    ( 6 ),    ( 7 ),    ( 8 ),    ( 9 );    -- -------------------------------------------------------------- CREATE TABLEIF    NOT EXISTS calendar ( datelist date, datehour datetime );    -- --------------------------------------------------------------INSERT INTO calendar ( datelist ) SELECT -- 生成按天的数据adddate( ( -- 这里的起始日期,你可以换成当前日期DATE_FORMAT( "2018-11-10", '%Y-%m-%d' ) ), numlist.id ) AS `date` FROM    (SELECT    n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id FROM    num n1    CROSS JOIN num AS n10    CROSS JOIN num AS n100    CROSS JOIN num AS n1000    CROSS JOIN num AS n10000     ) AS numlist;    -- --------------------------------------------------------------INSERT INTO calendar ( datehour ) SELECT -- 生成按小时的数据DATE_ADD( ( DATE_FORMAT( "2018-11-10", '%Y-%m-%d' ) ), INTERVAL numlist.id HOUR ) AS `date` FROM    (SELECT    n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id FROM    num n1    CROSS JOIN num AS n10    CROSS JOIN num AS n100    CROSS JOIN num AS n1000    CROSS JOIN num AS n10000     ) AS numlist;

 

 

 

 * 按天查询

SELECT    date( datelist ) datas,    count( * ) - 1 AS counts FROM    (SELECT    datelist FROM    calendar WHERE    ( '2018-11-17' <= date( datelist ) )     AND ( date( datelist ) <= '2018-11-19' ) UNION ALLSELECT    createtime FROM    snap_face    LEFT JOIN device ON snap_face.deviceID = device.id WHERE    ( '2018-11-17' <= date( snap_face.createtime ) )     AND ( date( snap_face.createtime ) <= '2018-11-19' )     ) temp GROUP BY    datas ORDER BY    datas;

* 按小时查询

SELECT    DATE_FORMAT(datehour,'%Y-%m-%d %H') datas,    count( * ) - 1 AS counts FROM    (SELECTDATE_FORMAT(datehour,'%Y-%m-%d %H') datehourFROM    calendar WHERE    ( '2018-11-17' <= date( datehour ) )     AND ( date( datehour ) <= '2018-11-19' ) UNION ALLSELECTDATE_FORMAT(createtime,'%Y-%m-%d %H') FROM    snap_face    LEFT JOIN device ON snap_face.deviceID = device.id WHERE    ( '2018-11-17' <= date( snap_face.createtime ) )     AND ( date( snap_face.createtime ) <= '2018-11-19' )     ) temp GROUP BY    datas ORDER BY    datas;

 

 

 

 

转载于:https://www.cnblogs.com/lancelee98/p/10006710.html

你可能感兴趣的文章
win系统查看自己电脑IP
查看>>
Backup&recovery备份和还原 mysql
查看>>
一道面试题及扩展
查看>>
Unity 3D 我来了
查看>>
setup elk with docker-compose
查看>>
C++ GUI Qt4学习笔记03
查看>>
Java基础回顾 —反射机制
查看>>
c# 前台js 调用后台代码
查看>>
2017-02-20 可编辑div中如何在光标位置添加内容
查看>>
$.ajax()方法详解
查看>>
jquery操作select(增加,删除,清空)
查看>>
Sublimetext3安装Emmet插件步骤
查看>>
MySQL配置参数
查看>>
全面理解Java内存模型
查看>>
存储过程
查看>>
生成器
查看>>
将一个数的每一位都取出来的方法!
查看>>
2) 十分钟学会android--建立第一个APP,执行Android程序
查看>>
面试题8:二叉树下的一个节点
查看>>
hash冲突的解决方法
查看>>