在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能否以更高效的方式做到这一点。
答案 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 来自人;