Java 在hibernate查询中给出条件以获取开始日期为上个月日期的值,即当前月份减去1

Java 在hibernate查询中给出条件以获取开始日期为上个月日期的值,即当前月份减去1,java,hibernate,Java,Hibernate,在hibernate查询中给出条件,以获取起始日期为上个月日期的值,即当前月份减去1 我在数据库中有一个表,它有一个日期字段。 我想编写一个hibernate查询,在该查询中,我将从日期在以下范围内的表中获取值:当前日期到30天减去当前日期 问题是。。 从PaymentInSlipDO pis、InwardDO inw、InwardPaySlipMap中选择任意项,其中map.inwardSeq=inw.id 和map.parentGuidObj=pis.id 和pis.paySlipStatu

在hibernate查询中给出条件,以获取起始日期为上个月日期的值,即当前月份减去1

我在数据库中有一个表,它有一个日期字段。 我想编写一个hibernate查询,在该查询中,我将从日期在以下范围内的表中获取值:当前日期到30天减去当前日期

问题是。。 从PaymentInSlipDO pis、InwardDO inw、InwardPaySlipMap中选择任意项,其中map.inwardSeq=inw.id 和map.parentGuidObj=pis.id 和pis.paySlipStatus“取消”
显然,减去30天不是正确的方法,因为如果你在当月的31日,你可能会在同一个月结束,或者如果日期是3月1日,你可能会回到两个月前,因为2月只有28天

最好的解决方案是使用or函数,因为它可以使用特定的日期单位,如分钟、小时、天、月、年等。只要用减号而不是加号就可以了。大多数数据库都有DATEADD函数,但它们的参数可能会有所不同,所以请查看文档

另一个选项是使用函数获取月份部分,并将其解析为整数,然后根据需要进行比较。再说一次,不要只减去一个月,否则明年一月你会有问题

尝试使用日历:

final String queryStr = 
      "select whatever whatever " +
      "from PaymentInSlipDO pis, InwardDO inw, InwardPaySlipMapDO map " +
      "where map.inwardSeq = inw.id " +
      "and map.parentGuidObj = pis.id and pis.paySlipStatus<>'CANCELLED' " +
      "and pis.paySlipDt<= :date";

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, -1);

query.setParameter("date", c.getTime());