如何在一个PostgreSQL列中存储不同的日期精度

时间:2014-01-20 12:57:15

标签: postgresql date database-design postgresql-9.1

我对某些单个事件有不同的日期类型。

他们可以像这样建立起来:

YYYY-MM-DD

YYYY-MM

YYYY

我想将数据存储在一列中。我如何为此目的设置列定义。

修改

一个例子:

CREATE TABLE events (event date);

INSERT INTO events (event) VALUES ('2003-12-12');

确定

INSERT INTO events (event) VALUES ('2003');
ERROR:  invalid input syntax for type date: "2003"
LINE 1: INSERT INTO events (event) VALUES ('2003');

我正在使用postgres 9.1

3 个答案:

答案 0 :(得分:1)

如果这是针对事件的,请查看时间戳或日期范围类型。然后,您可以根据需要存储相关范围(从头到尾)。

http://www.postgresql.org/docs/current/static/rangetypes.html

denis=# select '[2014-01-01,2015-01-01)'::daterange;
        daterange        
-------------------------
 [2014-01-01,2015-01-01)
(1 row)

denis=# select '[2014-01-01,2014-02-01)'::daterange;
        daterange        
-------------------------
 [2014-01-01,2014-02-01)
(1 row)

denis=# select '[2014-01-01,2014-01-02)'::daterange;
        daterange        
-------------------------
 [2014-01-01,2014-01-02)
(1 row)

denis=# select daterange('2014-01-01'::date, ('2014-01-01'::date + '1 year'::interval)::date);
        daterange        
-------------------------
 [2014-01-01,2015-01-01)
(1 row)

答案 1 :(得分:0)

根据我的知识,使用列类型作为varchar()而不是“date”数据类型,那么你可以存储不同类型的数据。

答案 2 :(得分:0)

我认为存储此类内容的唯一方法是使用存储部分日期的varchar列。

您可以添加一个检查约束,该约束将使完整日期的正确性有效(使用to_date()函数)。

这样的事情:

CREATE TABLE events 
(
   event varchar(10) not null,
   constraint chk_date check 
       (case  
           when length(event) = 4 then event::integer > 0  -- must be number
           when length(event) = 7 then concat(event,'-01')::date is not null -- make sure it's a valid month
           when length(event) = 10 then event::date is not null  -- make sure it's valid date
           else false 
        end
       )
);

检查约束确保您无法插入无效日期,甚至不能部分插入(例如'2013-17')。

有效性检查只能使用基于ISO日期格式的强制转换来完成,因为to_date('2013-17-01', 'yyyy-mm-dd')将转换为2014-05-03