补全数据 2种方式

1.数据库构造一个连续日期的表作为主表关联数据表查询  

最近7天的数据,没有数据自动补0

创建表结构:

DROP TABLE IF EXISTS `person_num_day`;
CREATE TABLE `person_num_day`  (
  `date` date NULL DEFAULT NULL,
  `person_num` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

 sql如下:  如果项目中 有连续的日期表, 就不用写  INTERVAL 1 day ,  INTERVAL 2 day, INTERVAL 3 day了, 我们拿来即用

SELECT a.*, ifnull(b.person_num, 0)
FROM  (
	SELECT curdate() as date
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 1 day)
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 2 day)
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 3 day)
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 4 day)
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 5 day)
    UNION ALL
    SELECT date_sub(curdate(), INTERVAL 6 day)
	) a LEFT JOIN (
    SELECT date, person_num FROM person_num_day GROUP BY date 
    ) b on a.date = b.date ORDER BY a.date DESC

2. 通过java代码构造连续的日期, 遍历连续的日期 和 数据库的数据日期进行匹配, 如果能匹配不上,直接用我造的日期 且 数据给null; 能匹配上就用数据库的日期和数据

对数据库没有的月份, 用代码补全连续的日期

@Resource
UserService userService;

    public static void main(String[] args) {
        // 定义补全后的结果list
        ArrayList<User> completeResultList = new ArrayList<>();
        // 比如数据库只查询到 2022-10 的数据
        List<User> userList = userService.getByList(ListUtil.toList(new User()));
        // java 代码构造连续且降序的日期
        List<String> dateList = ListUtil.toList("2022-12", "2022-11", "2022-10", "2022-09");
        // 遍历连续的日期 和 数据库的数据日期进行匹配
        dateList.forEach(date -> {
            User user= new User();
            // 如果日期和数据库的日期匹配 用数据库的日期和数据值
            User userMatch = userList.stream().filter(e -> e.getDataDate().equals(date)).findFirst().orElse(null);
            if (userMatch != null) {
                user.setId(userMatch.getId());
                user.setName(userMatch.getName());
                user.setDataDate(userMatch.getDataDate());
            } else {
                // 如果能匹配不上,直接用我造的日期
                user.setDataDate(date);
            }
            completeResultList.add(user);
        });

        // 打印补全数据后的结果
        System.out.println(completeResultList);
    }