如何在没有一年零件的情况下存储生日?

时间:2011-10-10 23:16:01

标签: postgresql date schema date-of-birth

类似的问题:Postgres birthdays selection

我们正在设计一项新功能:我们将存储人们生日的月和日部分,而不是年份。因此,在圣诞节出生的用户将拥有生日“12/25”。问题是,我们怎样才能在postgres中最好地代表这一点?

  1. date列需要一年的时间,并且还会拒绝非leapyears的leapdays。我们可以存储任意闰年的所有生日,例如'1972-12-25',但这有点像kludge。
  2. 我们可以使用两个int列,一个用于月份,一个用于一年,但我们完全丢失了pg的内置日期检查,您可以存储日期'02-31'
  3. 我们可以使用一个text列,但查询不会很好。
  4. 我们有什么选择吗?我们目前正倾向于一对整数列。

    编辑:

      

    为什么不存储出生日期 - 必须是有效日期 - 和   从那里去?

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

3 个答案:

答案 0 :(得分:7)

只需将日期存储在任意的leapyear中,并在SELECT中按需要格式化 我有很多案例我都是这样做的。它比其他所有想法都容易得多。

问题编辑后更新

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

答案 1 :(得分:3)

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

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

如果您正在为用户发送生日祝福等事情,您可能仍需要特别处理2月29日。

答案 2 :(得分:0)

这更像是客户端验证。

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

在提交表单之前检查它。

将其作为单个字符串列存储在表中,该列已编制索引。

每天,一个cron工作,扫描所有有效的条目,如今日/月组合,并按照类型(周年纪念日或出生日期等)等情况向他们的邮箱发送问候语。