Spring Boot 是否可以使用JPA和java.time.LocalDate日期格式按月从MySQL中查找数据?

6ioyuze2  于 2022-12-23  发布在  Spring
关注(0)|答案(4)|浏览(165)

我创建了一个应用程序,为此我需要使用JPAjava.time.LocalDate按月查找数据。那么,是否可以从mysql按月检索数据?
先谢谢你的帮助。

t9aqgxwy

t9aqgxwy1#

首先查找月份的开始日期和结束日期,然后使用JPA的between方法查找当前月份的数据。

LocalDate start = LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);

LocalDate end = LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);

在存储库中

List<Object> findByCreatedateGreaterThanAndCreatedateLessThan(LocalDate start,LocalDate end);
lg40wkob

lg40wkob2#

最好使用between关键字,它使事情分配得更短。

List<Object> findByCreatedateBetween(LocalDate start,LocalDate end);

另外,如果你想在Spring Data中使用LocalDateLocalDateTime对象,你应该使用转换器类Jsr310JpaConverters,否则文档将被存储为Blob而不是Dates(这对数据库的可移植性很不利)。
https://www.mkyong.com/spring-boot/spring-boot-spring-data-jpa-java-8-date-and-time-jsr310/

lb3vh1jj

lb3vh1jj3#

TL;医生

YearMonth.now( ZoneId.of( "Pacific/Auckland" ) )  // Get current month for particular time zone.
         .atDayOfMonth( 1 )                       // Get the first date of that month.
         .plusMonths( 1 )                         // Get first of next month for Half-Open query.

详情

假设MySQL中的列是DATE类型...

一个月一个月

LocalDate类表示没有时间和时区的纯日期值。

时区

时区在确定日期时至关重要。对于任何给定时刻,全球各地的日期都因时区而异。例如,在Paris France中,午夜后几分钟是新的一天,而在Montréal Québec中,这几分钟仍然是"昨天"。
continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3 - 4个字母的缩写,例如ESTIST,因为它们 * 不是 * 真正的时区,没有标准化,甚至不唯一(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

一米九一

YearMonth类表示整个月份。获取当前月份需要一个时区,如上所述。在月份的开始/结束时,当前时刻可能是新西兰奥克兰的"下一个"月份,而在印度加尔各答仍然是"上一个"月份。

YearMonth currentMonth = YearMonth.now( z ) ;

获取该月的第一个日期。

LocalDate start = currentMonth.atDayOfMonth( 1 ) ;

半开

通常,最好使用半开[)方法来定义时间跨度,其中开始是 * 包含 *,而结束是 * 不包含 *。因此,定义月份意味着从该月的第一个日期开始,一直到下一个月的第一个日期,但不包括该日期。

LocalDate stop = start.plusMonths( 1 ) ;

查询

不要在SQL中使用BETWEEN命令,因为它是完全封闭的[],开头和结尾都包含在内。半开使用>= & <逻辑。

SELECT when FROM tbl
WHERE when >= start 
AND when < stop 
;
uwopmtnx

uwopmtnx4#

它也很有用

@Query("from PogWorkTime p  where p.codePto = :codePto and month(p.dateApply) = :month and year(p.dateApply) = :year")
Iterable<PtoExceptWorkTime> findByCodePtoAndDateApply_MonthAndDateApply_Year(@Param("codePto") String codePto,@Param("month") int month, @Param("year") int year);

相关问题