【问题标题】:How to filter birthday only by day and month and between X days?如何仅按日和月以及 X 天之间过滤生日?
【发布时间】:2021-03-07 18:51:55
【问题描述】:

给定一个表 User,其中包含 id、name 和birth_date,我想过滤所有将在 X 天内庆祝生日的用户,忽略年份。

例如,如果今天是 11 月 24 日,我想获取所有从 11 月 24 日到 27 日庆祝生日的用户,不管他们的出生年份。

LocalDate today = ZonedDateTime.now().toLocalDate();
LocalDate endDay = today.plusDays(3);

-------------------------------------
filter from today to endDay

1 | User A | 11/24/1995
2 | User B | 09/02/2000
3 | User C | 11/26/1998
4 | User D | 11/25/2005

在这种情况下,我想获取用户 A、C 和 D。

我正在尝试使用 Java JPA @Query 注释来做到这一点,但如果有办法在 PostgreSQL 中做到这一点也可以正常工作。

【问题讨论】:

    标签: java postgresql spring-boot jpa


    【解决方案1】:

    您可以为此使用date_part 函数,但是如果您想要的时间段跨越到下个月或下一年,数学就会变得模糊。

    如果您通过检查月份和日期来完成,您将需要:

    1. 查询时间段何时适合当前月份
    2. 查询时间段何时适合两个月。

    如果您改为按年份 (doy) 进行检查,那么您必须担心转移到下一年,还要担心检查的日期是否在闰年,您正在查找的日期是否for 是在闰日之后,并且如果在您的应用程序中您正处于闰日之后。

    最后,您可以通过像这样to_char(birth_date, 'MM-DD') 格式化它来使用直接字符串比较。再次,您将需要两次查询您的最后日期何时跨入明年。 between 检查包含在内。

    ... where to_char(birth_date, 'MM-DD') BETWEEN '11-28' AND '12-01'
    
    
    ... where to_char(birth_date, 'MM-DD') BETWEEN '12-29' AND '12-31'
    OR to_char(birth_date, 'MM-DD') BETWEEN '01-01' AND '01-02'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2014-03-22
      • 2014-03-12
      • 1970-01-01
      • 2015-04-11
      • 2023-01-31
      • 2013-03-08
      相关资源
      最近更新 更多