存储日期,可选月/日

我想在Postgres数据库中存储日期。
唯一的问题是这个日期可以有可选的日期甚至是月份。

例:
用户提供他受雇的时间段 – 不是必需的完整日期(日+月+年),而只是开始年份和结束年份。
然而,有些用户在同一年只从5月到10月工作,所以也必须提供月份。

如何处理这种可选的日期部分?

无论如何,请使用正确的date类型。 存储文本或多列。 那将更昂贵,更不可靠。

使用to_date()函数,它适合处理开箱即用的需求。 例如,如果您使用模式'YYYYMMDD'调用它并且实际字符串缺少日期,月份和日期的字符,则默认为年/月的第一个月/日:

 db=# SELECT to_date('2001', 'YYYYMMDD'); to_date ------------ 2001-01-01 db=# SELECT to_date('200103', 'YYYYMMDD'); to_date ------------ 2001-03-01 

如果需要,您还可以存储指示年/月/日的精确标记。

虽然接受的答案是好的,但还有另一种选择。

ISO 8601

ISO 8601标准为各种日期时间值的文本表示定义了合理的格式。

一年以明显的方式呈现,一个四位数字: 2014

一年的月份用所需的连字符表示: 2014-01
请注意,在其他ISO 8601格式中,连字符是可选的。 但不是一年一个月,以避免歧义。

完整日期类似: 2014-08-21或没有可选连字符: 20140821 。 我建议保留连字符。

因此,您可以将值存储为文本。 文本长度会告诉您它是仅年份,年月还是日期。