• 技术文章 >数据库 >mysql教程

    sql中如何实现日期自动补全

    (*-*)浩(*-*)浩2020-09-14 16:38:54原创4879

    sql中实现日期自动补全的方法:首先生成某个范围的日历表数据;然后通过这个日历表连接查询需要统计数据表的数据;最后得出这个范围内完整的数据即可。

    最近在开发统计访问功能时,如果数据表里缺少某一天的数据,就会导致那天的记录丢失,但显示的时候还是需要那天的数据,没有的话,可以默认为 0,大概想到了两种解决办法:

    1. 将数据读出来后,在程序循环添加缺少的数据,但是这对于统计数据范围可变的需求,可能统计 7 天,30 天,60 天;通过程序来补全数据就显得有点麻烦了。

    2. 首先生成某个范围的日历表数据,再通过这个日历表连接查询需要统计数据表的数据,没有的话,默认为 0;这样就可以得出这个范围内完整的数据了,所以这种方案,更适合这种需求的变化。

    现在通过如下 sql 语句生成日历表:

    CREATE TABLE num (i INT);-- 创建一个表用来储存0-9的数字
    INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的数字,方便以后计算时间
    CREATE TABLE  IF NOT EXISTS calendar(DATE DATE); -- 生成一个存储日期的表,date是字段名
    -- 这里是生成并插入日期数据
    INSERT INTO calendar(DATE) SELECT
        ADDDATE(
            (   -- 起始日期,从2017-1-1开始
                DATE_FORMAT("2017-1-1", '%Y-%m-%d')
            ),
            numlist.id
        ) AS `date`
    FROM
        (
            SELECT
                n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000 AS id
            FROM
                num n1
            CROSS JOIN num AS n10
            CROSS JOIN num AS n100
            CROSS JOIN num AS n1000
        ) AS numlist;

    执行 sql 后生成 1W 条记录,从2017-01-01~2044-05-18,这些数据已经足够用很久了;也可以通过修改相对应的条件,生成更多的数据,这里就不详细说明了,根据需求修改就行。

    执行如下 sql 测试:

    SELECT COUNT(u.id) AS num, c.date FROM calendar AS c
    LEFT JOIN users AS u ON c.date = u.`created_at`
    WHERE c.date BETWEEN '2017-05-01' AND '2017-05-07'
    GROUP BY c.`date`
    ORDER BY c.`date`

    得出如下结果:

    date.jpg

    以上就是sql中如何实现日期自动补全的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:sql
    上一篇:sql和mysql语法有什么不同 下一篇:sql怎么加密表
    Web大前端开发直播班

    相关文章推荐

    • 学sql和access哪个好?• 学sql server有什么用?• sql server实例是什么• sql和mysql语法有什么不同

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网