Java补全数据库查询统计数据缺失的日期

 

      在进行数据库数据统计时,比如按天统计数据,一个月中有一些天没有数据的,数据库也就没查出来,对于后台来说这没什么。但是前端展示的时候要补全缺失的日期数据,比如2020-05-12没有数据,就添加键日期,并把值补为0。(假如后台查询的数据数据结构为List<Map<String, Object>>)。

      如图,数据库查询出来的统计数据如下

       我的需求是查询出近30天的所有数据,很显然,上面的数据是有缺失的,我需要把“2020-04-13”到“2020-05-12”(当前)的所有数据都列出来,没有的话就补0。

方式一:依赖数据库解决,新建一个数据表,left join 来查询,或者拼接 union。此处先不做讲解。

方式二:在程序中进行补全。

  1. 写一个补全日期工具类,给定指定的开始和结束日期,返回两者之间所有的日期的字符串列表
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 补全日期工具类.
 *
 * @author linzp
 * @version 1.0.0
 * CreateDate 2020/5/11 17:13
 * description
 */
public final class CompletionDateUtils {

  /**
   * 隐藏构造方法.
   */
  private CompletionDateUtils() {
  }

  /**
   * 数据库查询出来的统计数据有时候日期是不连续的.
   * 但是前端展示要补全缺失的日期.
   * 此方法返回一个给定日期期间的所有日期字符串列表.
   * 具体在业务逻辑中去判断补全.
   *
   * @param startDate 开始日期
   * @param endDate   结束日期
   * @return
   */
  public static List<String> completionDate(
          LocalDateTime startDate,
          LocalDateTime endDate) {
    //日期格式化
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    List<String> dateList = new ArrayList<>();
    //遍历给定的日期期间的每一天
    for (int i = 0; !Duration.between(startDate.plusDays(i), endDate).isNegative(); i++) {
      //添加日期
      dateList.add(startDate.plusDays(i).format(formatter));
    }
    return dateList;
  }

  /**
   * main.
   *
   * @param args
   */
  public static void main(String[] args) {
    //测试过去30天
    completionDate(LocalDateTime.now().minusDays(29), LocalDateTime.now());
  }
}

       2. 得到指定日期之间的列表如下图

      3. 得到指定日期之间的列表后,遍历列表,然后和数据库查询出来的数据进行比较,如果相同则添加数据库查询的Map到新的列表,不同则构造一个新的Map(key:日期,value:0),然后添加到新的列表。核心代码如下:

    //获取日期
    LocalDateTime startDate = LocalDateTime.now().minusDays(29);
    LocalDateTime endDate = LocalDateTime.now();
    //3.补全为空的日期
    //补全后的结果
    List<Map<String, Object>> result = new ArrayList<>();
    boolean dbDateExist = false;
    List<String> dateList = CompletionDateUtils.completionDate(startDate, endDate);
    log.info("指定日期期间所有日期字符串为=={}",dateList);
    for (String date : dateList) {

       //table为数据库查询出来的对象列表,结构为List<Map<String, Object>>
      for (Map<String, Object> row : table) {
        if (row.get("daytime").equals(date)) {
          //集合已包含该日期
          dbDateExist = true;
          result.add(row);
          break;
        }
      }
      //添加补全的数据到最后结果列表
      if (!dbDateExist) {
        Map<String, Object> temp = new HashMap<>(2);
        temp.put("daytime", date);
        temp.put("total", 0);
        result.add(temp);
      }
      //状态修改为不存在
      dbDateExist = false;
    }

      4.其中result为补全的最终结果,打印拼接的最终结果如下:

到此补全日期成功啦。工具类做成了指定日期之间。可以任意设置指定的日期。个人觉得这种方式比使用SQL来解决的方式要好一点。

码字不易,觉得有帮助到的亲们点个赞吧 ~

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
以下是一个Java代码示例,用于检查数据库中是否存在缺失数据,并在数据缺失时发送短信通知: ```java import java.sql.*; import java.util.*; import com.twilio.*; import com.twilio.rest.api.v2010.account.Message; import com.twilio.type.PhoneNumber; public class MissingDataNotifier { // 数据库连接信息 private static final String DB_URL = "jdbc:mysql://localhost/mydatabase"; private static final String DB_USER = "myuser"; private static final String DB_PASSWORD = "mypassword"; // Twilio短信服务信息 private static final String TWILIO_ACCOUNT_SID = "your_account_sid"; private static final String TWILIO_AUTH_TOKEN = "your_auth_token"; private static final String TWILIO_FROM_PHONE_NUMBER = "your_twilio_phone_number"; private static final String TO_PHONE_NUMBER = "destination_phone_number"; public static void main(String[] args) { try { // 连接数据库 Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); // 构造查询语句 String query = "SELECT * FROM mytable WHERE some_column IS NULL"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); // 如果查询结果为空,则无缺失数据 if (!rs.next()) { System.out.println("No missing data found."); return; } // 构造短信消息 String messageBody = "Missing data found in database!"; Twilio.init(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); Message message = Message.creator( new PhoneNumber(TO_PHONE_NUMBER), new PhoneNumber(TWILIO_FROM_PHONE_NUMBER), messageBody) .create(); System.out.println("Sent message: " + message.getSid()); } catch (SQLException ex) { ex.printStackTrace(); } } } ``` 以上示例中,我们使用了JDBC API连接了一个MySQL数据库,并查询了某个表中是否存在某个列为空的记录。如果查询结果为空,则说明数据完整;否则,则使用Twilio API发送短信通知。您需要将代码中的数据库连接信息和Twilio短信服务信息替换为您自己的信息。同时,您需要将`com.twilio`和`com.mysql.jdbc`这两个依赖项添加到您的项目中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林志鹏JAVA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值