我正在重新设计一个数据库,该数据库当前以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.html和http://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
答案 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
请注意字符文字前面的关键字timestamp
和date
。
修改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标准,而不是特定的日期格式,尽管标准本身确实具有日期和时间的标准格式。