【问题标题】:How to store birthdays without a year part?如何存储没有年份部分的生日?
【发布时间】:2011-12-04 21:42:50
【问题描述】:

类似问题:Postgres birthdays selection

我们正在设计一项新功能:我们将存储人们生日的月份和日期部分,但不存储年份。所以圣诞节出生的用户的生日是“12/25”。问题是,我们如何才能最好地在 postgres 中表示这一点?

  1. date 列需要一年,并且还拒绝非闰年中的闰日。我们可以使用任意闰年存储所有生日,例如'1972-12-25',但这有点麻烦。
  2. 我们可以使用两个 int 列,一个代表月份,一个代表年份,但我们会完全失去 pg 的内置日期检查功能,您可以存储日期 '02-31'
  3. 我们可以使用单个 text 列,但对此进行查询并不好。

有没有我们遗漏的选项?我们目前倾向于使用一对整数列。

编辑:

为什么不只存储出生日期(必须是有效日期),以及 从那里去?

隐私 - 这是一项可选功能,我们不想要求提供比需要更多的个人信息。

【问题讨论】:

  • 为什么不只存储出生日期(必须是有效日期),然后从那里开始?
  • @K-ballo:可能情况不允许知道用户出生的年份

标签: postgresql schema date


【解决方案1】:

只需使用任意闰年存储日期,并在 SELECT 中根据需要对其进行格式化。
我有很多情况就是这样做的。这比所有其他想法都容易得多。

问题编辑后更新

如果出生年份是可选的,那么日期还有一个额外的优势,即您可以存储年份(如果有的话) - 在相同的 4 个字节中的日期列中需要。使用任意的闰年,否则对于没有年份的日期是不可能的。比如 2400 或 1804。

【讨论】:

  • 如果您(不小心?)将其存储为 2400 或 1804 可能会导致问题将其转换为 Unix 样式的时间戳。 1972 年没有这个问题,但它的缺点是它很容易成为有效的生日。 2036 年避免了这两个问题,但只有在您开始将 2036 年出生的人纳入您的数据库之前。也许使用 1972 加上一个标志来告诉您年份是否有效?
  • @KeithThompson 是的,好点。真的取决于你需要什么。三思而后行。
【解决方案2】:

由于通常的 Postgres 日期函数无论如何都不会真正帮助您,因此最好将月份和日期存储为整数列。您将无法“验证”日期,只需检查该日期是否不超过给定月份的最大天数(如果用户输入 2 月 29 日,您就无法真正与他们争论)。

如果您担心数据的有效性,您可以将月/日对作为外键放入一个存储 366 行的表中,每个有效的月/日对对应一个。

如果您正在执行诸如向用户发送生日祝福之类的操作,您可能仍需要特别处理 2 月 29 日。

【讨论】:

    【解决方案3】:

    这更像是客户端验证。

    我们过去常常为用户提供月份和日期的列表。

    在提交表单之前检查它。

    将其作为单个字符串列存储在一个表中,并对其进行索引。

    每天,一个 cron 作业,扫描所有属于今天/月份组合的有效条目,并根据场合类型(例如(周年纪念日或生日)等)向他们的邮箱发送问候。

    【讨论】:

    • 客户端验证永远不会完全证明。
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2023-04-11
    • 2021-04-12
    • 2010-11-14
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多