存储日期,可选月/日

时间:2014-03-17 14:25:46

标签: ruby-on-rails ruby database postgresql database-design

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

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

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

2 个答案:

答案 0 :(得分:3)

无论如何都要使用正确的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

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

答案 1 :(得分:2)

虽然accepted answer很好,但还有另一种选择。

ISO 8601

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

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

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

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

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