我对某些单个事件有不同的日期类型。
他们可以像这样建立起来:
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
答案 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