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


本文摘自PHP中文网,作者(*-*)浩,侵删。

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 server中的聚合函数有哪些

mysql数据库索引的最左匹配原则

asp.net 数据库备份还原(sqlserver+access)

mysql易学易用之mysql不为人知的特性

sql server中搜索特定的对象

左连接、右连接、内连接、全外连接的区别是什么?

sql中datediff函数怎么用?(代码详解)

深入理解sql的四种连接-左外连接、右外连接、内连接、全连接

java分页拦截类实现sql自动分页

sql堆叠注入简介

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...