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

时间:2017-04-11 14:42:25

标签: jpa spring-boot

我创建了一个应用程序,因此我需要使用JPAjava.time.LocalDate按月查找数据。那么,是否可以从mysql开始按月检索数据?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

首先查找月份的开始和结束日期,并在JPA的方法之间使用以查找当月的数据。

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);

答案 1 :(得分:2)

最好使用between关键字,这会让事情变得更短。

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

此外,如果您想将LocalDateLocalDateTime对象与Spring Data一起使用,则应使用转换器类Jsr310JpaConverters,否则文档将存储为Blob而不是Dates(其中对数据库的可移植性不利)。请参阅本教程,了解如何实现转换器。

https://www.mkyong.com/spring-boot/spring-boot-spring-data-jpa-java-8-date-and-time-jsr310/

答案 2 :(得分:0)

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

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

YearMonth

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 
;