类似的问题:Postgres birthdays selection
我们正在设计一项新功能:我们将存储人们生日的月和日部分,而不是年份。因此,在圣诞节出生的用户将拥有生日“12/25”。问题是,我们怎样才能在postgres中最好地代表这一点?
date
列需要一年的时间,并且还会拒绝非leapyears的leapdays。我们可以存储任意闰年的所有生日,例如'1972-12-25'
,但这有点像kludge。int
列,一个用于月份,一个用于一年,但我们完全丢失了pg的内置日期检查,您可以存储日期'02-31'
。text
列,但查询不会很好。我们有什么选择吗?我们目前正倾向于一对整数列。
编辑:
为什么不存储出生日期 - 必须是有效日期 - 和 从那里去?
隐私 - 这是一项可选功能,我们不想要求提供超出需要的个人信息。
答案 0 :(得分:7)
只需将日期存储在任意的leapyear中,并在SELECT中按需要格式化 我有很多案例我都是这样做的。它比其他所有想法都容易得多。
如果出生年份是可选那么日期还有一个额外的好处,即可以存储年份(如果有的话) - 相同的4个字节的日期列需要。使用任意的leapyear,否则对于没有一年的日期是不可能的。像2400或1804。
答案 1 :(得分:3)
由于通常的Postgres日期函数无论如何都不会真正帮助你,所以最好将月份和日期存储为整数列。您将无法“验证”日期,只能检查当天是否超过给定月份的最大天数(如果用户输入2月29日,您无法与他们争论)。
如果您担心数据的有效性,您可以将月/日对作为外键存入366行,每个有效月/日对一个。
如果您正在为用户发送生日祝福等事情,您可能仍需要特别处理2月29日。
答案 2 :(得分:0)
这更像是客户端验证。
我们过去常常为用户提供月份和日期的列表。
在提交表单之前检查它。
将其作为单个字符串列存储在表中,该列已编制索引。
每天,一个cron工作,扫描所有有效的条目,如今日/月组合,并按照类型(周年纪念日或出生日期等)等情况向他们的邮箱发送问候语。