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

这篇文章将为大家详细讲解有关如何在sql中实现日期自动补全,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

十年的独山子网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整独山子建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“独山子网站设计”,“独山子网站推广”以来,每个客户项目都认真落实执行。

最近在开发统计访问功能时,如果数据表里缺少某一天的数据,就会导致那天的记录丢失,但显示的时候还是需要那天的数据,没有的话,可以默认为 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`

得出如下结果:

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

关于如何在sql中实现日期自动补全就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


新闻名称:如何在sql中实现日期自动补全
标题链接:http://myzitong.com/article/pcghgo.html