在日期范围之间添加值



试图写一个程序,我在数据库中的日期范围之间持有的一些数据。在日期范围之间可能有两行或三行。每行都有一个保存值,我需要在该日期范围中添加每个值。谁能给我提个解决办法吗?我试过了,但是不工作。

for(int i=0;i<filteredStartDate.size();i++) {
Long sum = null;
if(filteredStartDate.get(i).isBefore((ChronoLocalDate) filteredEndDate)) {
sum = sum+listHoldingsDBRecords.get(i).getHoldings();
}
}

请帮助。

我已经重现了我认为是你的情况。我使用record作为控股。

public class SumDateRange {
record Holdings(long getHoldings) {
}

public static void main(String[] args) {
List<Holdings> listHoldingsDBRecords =
List.of(new Holdings(10), new Holdings(20),
new Holdings(30), new Holdings(140),
new Holdings(150), new Holdings(160));

List<LocalDate> filteredStartDate =
List.of(LocalDate.parse("2022-01-15"),
LocalDate.parse("2022-01-20"),
LocalDate.parse("2022-01-30"),
LocalDate.parse("2022-02-15"),
LocalDate.parse("2022-02-15"),
LocalDate.parse("2022-02-15"));

LocalDate filteredEndDate = LocalDate.parse("2022-01-31");

long sum = 0;
for (int i = 0; i < filteredStartDate.size(); i++) {
if (filteredStartDate.get(i).isBefore(filteredEndDate)) {
sum = sum
+ listHoldingsDBRecords.get(i).getHoldings();
}
}
System.out.println(sum);
}
}

打印

60

请记住,结束日期之前的任何日期都是有效的。因此,您可能需要一个可接受的最小日期,并在范围内进行检查:

if (filteredStartDate.get(i).isAfter(minimumAcceptableDate) && 
filteredStartDate.get(i).isBefore(filteredEndDate)) {

但以上完全取决于你的最终目标和所涉及的数据。

如前所述,通常最好在数据库上进行这种工作。但是你的问题是关于Java的,所以现在开始。

关于ChronoLocalDate的使用,如果你研究Javadoc,你会发现抽象类、接口和超类不是java中用于应用程序开发的。时间,一般。这些是java内部使用的。时间本身,以及为java实现时间顺序的第三方。时间框架。

要跟踪作为一对日期的日期范围,我建议在项目中添加ThreeTen-Extra库。该库提供了LocalDateRange类来表示一对LocalDate对象。该类提供了方便的方法,如contains,abuts等。

为了在Java中表示你的数据,定义一个映射,LocalDateRange作为键,List作为持有号。在map之后,您可以对条目进行循环,以报告每个列表的总和。

Map< LocalDateRange , List< BigDecimal > > map = … ; 

这个结构被称为multimap,意思是每个键映射到多个值的集合,而不是单个值。

所有这些已经在Stack Overflow上讨论过很多次了。