【问题标题】:Retrieve upcoming birthdays in Postgres在 Postgres 中检索即将到来的生日
【发布时间】:2017-09-12 22:29:24
【问题描述】:

我在 postgres 数据库中有一个带有 dob(出生日期)字段的用户表。

我想编写一个查询来检索接下来五个即将到来的生日。我认为需要考虑以下几点-

  • 无法按出生日期排序,因为年份可能不同。
  • 您希望结果按日期/月份排序,但从今天开始。因此,例如,昨天的日期将是最后一行。
  • 理想情况下,我想在没有函数的情况下执行此操作。不过不会破坏交易。

在 SO 上提出了类似的问题,但 most 甚至没有公认的答案。谢谢你。

【问题讨论】:

  • 如果是即将到来的生日,为什么要包括昨天的行?
  • 你尝试了什么?
  • @VamsiPrabhala - 我只是想说明排序应该如何工作。

标签: sql postgresql postgresql-9.6


【解决方案1】:

嗯,这被否决了很多。但无论如何我都会发布我的答案。其中一个答案帮助我得出了最终解决方案,但该答案已被其所有者出于某种原因删除。

无论如何,这个查询完美地工作。它给出了接下来的 5 个即将到来的生日以及日期。

SELECT id, name,
  CASE
    WHEN dob2 < current_date THEN dob2 + interval '1 year'
    ELSE dob2
  END 
  AS birthday
FROM people, 
make_date(extract(year from current_date)::int, extract(month from dob)::int, extract(day from dob)::int) as dob2
WHERE is_active = true
ORDER BY birthday
LIMIT 5;

【讨论】:

  • 如果有人在 2 月 29 日过生日,我认为这将在非闰年中断。
【解决方案2】:

您可以查看出生日期并与当前日期的出生日期进行比较:

SELECT doy
    , extract(doy from dob) - extract(doy from current_date) as upcoming_bday
FROM users
WHERE extract(doy from dob) - extract(doy from current_date) >= 0
order by 2 
limit 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多