我创建了一个应用程序,因此我需要使用JPA
和java.time.LocalDate
按月查找数据。那么,是否可以从mysql
开始按月检索数据?
提前感谢您的帮助。
答案 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);
此外,如果您想将LocalDate
或LocalDateTime
对象与Spring Data一起使用,则应使用转换器类Jsr310JpaConverters
,否则文档将存储为Blob而不是Dates(其中对数据库的可移植性不利)。请参阅本教程,了解如何实现转换器。
https://www.mkyong.com/spring-boot/spring-boot-spring-data-jpa-java-8-date-and-time-jsr310/
答案 2 :(得分:0)
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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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
;