Java中yyyy-MM-dd转LocalDateTime报错及数据库查询问题
解决yyyy-MM-dd日期转LocalDateTime及数据库查询问题
1. 正确解析yyyy-MM-dd为LocalDateTime
直接用LocalDateTime.parse()解析仅含日期的字符串会报错,因为输入缺少时间维度信息。推荐两种解决方式:
方式一:先转LocalDate再补全时间
先将字符串解析为LocalDate,再补充当天起始/指定时间转为LocalDateTime:
String inputDate = "2023-02-26"; // 解析为LocalDate LocalDate localDate = LocalDate.parse(inputDate); // 转为当天00:00:00的LocalDateTime LocalDateTime startOfDay = localDate.atStartOfDay(); // 若要指定具体时间,比如12:00:00 LocalDateTime customTime = localDate.atTime(12, 0, 0);
方式二:自定义DateTimeFormatter补默认时间
通过Formatter自动补全缺失的时间字段:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd") .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) .toFormatter(); LocalDateTime localDateTime = LocalDateTime.parse(inputDate, formatter);
2. 用该日期查询数据库LocalDateTime类型数据
数据库存储的LocalDateTime包含时间部分,绝对不能用等于判断(会漏掉当天非00:00的记录),必须用范围查询覆盖当天所有时间:
SQL查询示例
SELECT * FROM your_table WHERE create_time >= '2023-02-26 00:00:00' AND create_time < '2023-02-27 00:00:00';
Java代码(Spring Data JPA示例)
方式1:用内置查询方法
// 仓库接口定义方法 List<YourEntity> findByCreateTimeBetween(LocalDateTime start, LocalDateTime end); // 调用时生成时间范围 LocalDate inputDate = LocalDate.parse("2023-02-26"); LocalDateTime start = inputDate.atStartOfDay(); LocalDateTime end = inputDate.plusDays(1).atStartOfDay(); List<YourEntity> result = yourRepository.findByCreateTimeBetween(start, end);
方式2:自定义JPQL查询
@Query("SELECT e FROM YourEntity e WHERE e.createTime >= :start AND e.createTime < :end") List<YourEntity> findByDateRange(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end);
关键注意点
- 用
< 次日00:00替代<= 当日23:59:59,避免遗漏毫秒级的末尾数据(如23:59:59.999)。 - 不要直接将
LocalDate与数据库的LocalDateTime字段做等值匹配,会导致类型不兼容或数据遗漏。
内容的提问来源于stack exchange,提问作者Shanka Somasiri
相关产品推荐
相关产品推荐

