LocalDate日期范围查询问题:如何匹配同起止日期的WorkItem
解决WorkItem日期范围筛选包含当天数据的问题
你现在的代码用isAfter和isBefore做日期比较,这两个方法是严格大于和严格小于的逻辑,所以当起止日期相同时,当天的updateDate既不会满足“大于当天”也不会满足“小于当天”,自然就被过滤掉了。
要解决这个问题,我们需要把条件改成包含起止日期的范围匹配,也就是让updateDate大于等于起始日期,并且小于等于结束日期。对应到LocalDate的方法,可以用!w.getUpdateDate().isBefore(parsedStartDate)来表示“不早于起始日期”(也就是>=),用!w.getUpdateDate().isAfter(parsedEndDate)来表示“不晚于结束日期”(也就是<=)。
修改后的代码如下:
public List<WorkItem> getWorkItemsByDate(String startDate, String endDate) throws ParseException { LocalDate parsedStartDate = LocalDate.parse(startDate); LocalDate parsedEndDate = LocalDate.parse(endDate); return workItemRepository.findAll().stream() .filter(w -> !w.getUpdateDate().isBefore(parsedStartDate) && !w.getUpdateDate().isAfter(parsedEndDate)) .collect(Collectors.toList()); }
另外还有一种等价的写法,用isEqual配合原有的方法拼出逻辑,可读性稍弱一些:
.filter(w -> (w.getUpdateDate().isAfter(parsedStartDate) || w.getUpdateDate().isEqual(parsedStartDate)) && (w.getUpdateDate().isBefore(parsedEndDate) || w.getUpdateDate().isEqual(parsedEndDate)))
最后提个小建议:如果你的数据量较大,这种在内存中做Stream过滤的方式效率不高,建议直接在Repository层写JPQL或者用Specification做数据库层面的筛选,能大幅提升性能哦。
内容的提问来源于stack exchange,提问作者oneoe
相关产品推荐
相关产品推荐

