用于ISO 8601日期的数据类型是什么?

时间:2012-10-30 14:43:30

标签: mysql postgresql iso8601

我正在重新设计一个数据库,该数据库当前以2012-10-27T07:30:38+00:00的格式将ISO 8601日期导入到varchar字段中。当前数据库托管在MySQL 5.5服务器上。

在搜索文档和各种SO帖子时,我还没有找到关于我应该在MySQL中使用什么数据类型的明确答案。最接近的帖子是:MySQL insert to DATETIME: is it safe to use ISO::8601 format?,它提供各种各样的工作,但这不是一个理想的选择。

MySQL文档(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html)没有说明,我在官方文档中找到的唯一参考位于页面:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

表示“第一个和第二个参数的可能值导致几个可能的格式字符串(对于使用的说明符,请参阅DATE_FORMAT()函数说明中的表格。)ISO格式是指ISO 9075,而不是ISO 8601。 “

现在,PostgreSQL文档专门提到了ISO8601(http://www.postgresql.org/docs/9.2/static/datetime-keywords.htmlhttp://www.postgresql.org/docs/9.2/static/datatype-datetime.html),这引出了我的问题:

MySQL是否正确支持ISO 8601,还是应该考虑使用原生支持的数据库?

- 编辑 -

尝试将上面的示例时间戳插入日期时间列会出现以下错误:

10:55:55    insert into test(date1) values('2012-10-27T07:30:38+00:00') Error Code: 1292. Incorrect datetime value: '2012-10-27T07:30:38+00:00' for column 'date1' at row 1 0.047 sec

4 个答案:

答案 0 :(得分:9)

不要在varchar列中存储日期或时间戳值。您无法确保存储正确的值(没有人阻止您在其中存储2012-02-31 28:99:70

如果您不需要时间部分,请使用date数据类型(在MySQL和PostgreSQL中可用),如果您确实需要时间使用timestamp(或MySQL中的datetime ) 数据类型。

值的格式化应该在您的前端完成,或者如果您必须在SQL中使用例如检索值时的to_char()(或MySQL中的等价物)。

再次:永远不要在varchar中存储日期或时间戳(就像你永远不应该在varchar列中存储实数一样)。

以下是日期/时间数据类型的MySQL概述:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html

以下是date7time数据类型的PostgreSQL概述:http://www.postgresql.org/docs/current/static/datatype-datetime.html

修改

如果您担心文字格式。两个DBMS都支持标准的ANSI Date和Timestamp文字:

insert into some_table 
   (ts_column, date_column)
values
   (timestamp '2012-10-27T07:30:38+00:00', DATE '2012-12-30');

PostgreSQL的SQLFiddle:http://sqlfiddle.com/#!12/cdd39/1

请注意字符文字前面的关键字timestampdate

修改2

似乎MySQL无法插入这样的值,尽管可以在SELECT语句中使用该文字:

答案 1 :(得分:2)

Postgresql可以处理这种格式:

select timestamp '2012-10-27T07:30:38+00:00';
      timestamp      
---------------------
 2012-10-27 07:30:38

或时区:

select timestamptz '2012-10-27T07:30:38+00:00';
      timestamptz       
------------------------
 2012-10-27 05:30:38-02

而MySQL似乎并不关心时区部分:

create table t (ts timestamp);

insert into t (ts) values
('2012-10-27T07:30:38+03:00'),
('2012-10-27T07:30:38-02:00');

select * from t;
+---------------------+
| ts                  |
+---------------------+
| 2012-10-27 07:30:38 |
| 2012-10-27 07:30:38 |
+---------------------+

答案 2 :(得分:1)

使用datetime或timestamp进行存储的另一个好处。 在phpMyAdmin或phpPgAdmin中,该值显示为字符串,例如2015-01-22 11:13:42因此,找到一个日期就好像它存储为varchar或int。

我认为服务器的时区很重要。 我看到MySql中的时间戳不显示微秒。 我知道MySQL使用UTC-Time来表示时间戳和日期时间字段。 因此,请将这些值作为UTC时间戳提供。

答案 3 :(得分:0)

ISO 8601日期格式“YYYY-MM-DD”是MySQL在显示日期值时内部发出的,它可以导入它们。

这些比“MM / DD / YY”这样的“美国风格”日期更为可取,其中有太多的歧义无法自动解决。

ISO 9075似乎是指整个SQL标准,而不是特定的日期格式,尽管标准本身确实具有日期和时间的标准格式。