给出生日期如何计算下一个生日?

时间:2016-05-06 20:48:53

标签: postgresql

在Postgres数据库中给出此模式:

CREATE TABLE person (
    id serial PRIMARY KEY,
    name text,
    birth_date date,
);

如何在今天之后查询表格以获取每个人下一个生日的日期?

例如,如果Bob的birth_date是2000-06-01,那么他的下一个生日将是2016-06-01。

注意:我不是在寻找birth_date +预先定义的interval,而是寻找一个人出生的下一周年。

我已经用Python写了等价物:

def next_birthday(self):
    today = datetime.date.today()
    next_birthday = self.birth_date.replace(year=today.year)
    if next_birthday < today:
        next_birthday = next_birthday.replace(year=today.year + 1)
    return next_birthday

但是,我想看看Postgres能否以更高效的方式做到这一点。

3 个答案:

答案 0 :(得分:5)

select birth_date,
       cast(birth_date + ((extract(year from age(birth_date)) + 1) * interval '1' year) as date) as next_birthday
from person
where name = 'Bob'

表达式(extract(year from age(birth_date)) + 1) * interval '1' year计算(完整)年份下一个生日的年龄。将其添加到出生日期时,这将给下一个生日。

强制转换是获得真实date的必要条件,因为date + interval会返回时间戳(包括时间)。

如果您移除了where条件,那么您将获得所有&#34; next&#34;生日。

您还可以获取即将到来的生日列表,例如:接下来的30天使用这样的东西:

select next_birthday,
       next_birthday - current_date as days_until_next
from (
  select birth_date,
         cast(birth_date + ((extract(year from age(birth_date)) + 1) * interval '1' year) as date) as next_birthday
  from person
) as upcoming
where upcoming.next_birthday <= current_date + 30
order by next_birthday;

答案 1 :(得分:0)

Exception in thread "pool-1-thread-5" java.lang.ClassCastException: java.util.concurrent.CopyOnWriteArrayList cannot be cast to java.util.ArrayList

答案 2 :(得分:-1)

选择日期birth_date + interval'1 year'作为next_birthday 来自人;