补全数据 2种方式

1. 通过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);
    }

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

最近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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值