Criteria Builder between()时间范围:是否包含毫秒级时间边界?
问题解答
你的代码中,当当前时间为上午10:05时,该谓词仅截止到10:04:00.000,不会包含10:04:59.999的时间戳,原因如下:
- 当当前时间是10:05整时,
LocalDateTime.now(ZoneOffset.UTC).minusMinutes(1)生成的是10:04:00.000(精确到纳秒则为10:04:00.000000000),转换为Timestamp后对应的就是这个时间点。 - JPA的
between谓词对应SQL的BETWEEN语法,会包含左右两个边界值,但10:04:59.999的时间戳数值明显大于右边界10:04:00.000,因此不在范围内。
如果想覆盖10:00到10:04的完整时间段(包含10:04:59.999),更合理的做法是使用半开区间,示例代码如下:
LocalDateTime utcNow = LocalDateTime.now(ZoneOffset.UTC); LocalDateTime startTime = utcNow.minusMinutes(5); // 结束时间设为10:05:00.000,确保包含10:04的最后一刻 LocalDateTime endTime = utcNow; predicates.add(criteriaBuilder.greaterThanOrEqualTo( root.get("date"), criteriaBuilder.literal(Timestamp.valueOf(startTime)) )); predicates.add(criteriaBuilder.lessThan( root.get("date"), criteriaBuilder.literal(Timestamp.valueOf(endTime)) ));
内容的提问来源于stack exchange,提问作者Tech Rider
相关产品推荐
相关产品推荐

