如何在PostgreSQL中混合存储部分日期,哪种格式可以是yyyy-mm-dd、yyyy-mm或yyyy?

如何在PostgreSQL中混合存储部分日期,哪种格式可以是yyyy-mm-dd、yyyy-mm或yyyy?,postgresql,date,Postgresql,Date,当我混合使用yyyy-mm-dd格式(如2000-12-31)、yyy-mm和yyy时,我应该如何在PostgreSQL中存储日期?我还可以使用日期列吗?to_DATE()函数可以解析不完整的日期。如果缺少日期,则默认日期为01。如果两者都缺失,则它将按天和月默认为01。如果传递空字符串,则整个表达式将默认为0001-01-01 BC: =# select to_date('2020', 'yyyy-mm-dd'); to_date ------------ 2020-01-01 (1 r

当我混合使用
yyyy-mm-dd
格式(如2000-12-31)、
yyy-mm
yyy
时,我应该如何在PostgreSQL中存储日期?我还可以使用
日期列吗?

to_DATE()
函数可以解析不完整的日期。如果缺少日期,则默认日期为
01
。如果两者都缺失,则它将按天和月默认为
01
。如果传递空字符串,则整个表达式将默认为
0001-01-01 BC

=# select to_date('2020', 'yyyy-mm-dd');
  to_date
------------
 2020-01-01
(1 row)

=# select to_date('2020-06', 'yyyy-mm-dd');
  to_date
------------
 2020-06-01
(1 row)

=# select to_date('2020-06-28', 'yyyy-mm-dd');
  to_date
------------
 2020-06-28
(1 row)

=# select to_date('', 'yyyy-mm-dd');
    to_date    
---------------
 0001-01-01 BC
(1 row)

这些替换是否适用于您的用例

您在评论中表示这是不可接受的。

日期和时间数据类型有三大优势

  • 他们使用更少的空间
  • 它们通过引擎进行了验证
  • 引擎提供了各种各样的函数和操作符来操作日期和时间值

  • 如果您能提供有关如何使用无效日期值(如
    2020-00-00

    是)的信息,人们可以提供想法。您可以使用的最佳选择是使用日期列。如果需要,您可以在第二列中保留精度,例如整数,其中1表示“年”,2表示“年-月”,3表示“年-月-日”。这样你就可以分辨出“2020年某个时候”、“2020年1月某个时候”和“2020年1月1日”之间的区别。看看这个问题。问题是我还有1月1日的条目是有效的(已验证)。2020-00-00这样的日期更容易接受。@DevonDahon那么,您可以添加一个说明,说明您打算如何使用不完整的数据对您的问题进行编辑吗?例如,这些日期应该如何显示在报告或用户界面中?Postgres只接受日期/时间戳字段中的有效日期/时间,因此
    2020-00-00
    将不起作用。如果要这样做,则需要存储为字符串。