补全数据 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);
}