12

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

在搜索文档和各种 SO 帖子时,我还没有找到关于我应该在 MySQL 中为此使用什么数据类型的明确答案。最接近的帖子是: MySQL 插入 DATETIME:使用 ISO::8601 格式是否安全?它提供了一种解决方法,但这不是一个理想的选择。

MySQL 文档 ( http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html ) 没有说明,我在官方文档中可以找到的唯一参考资料位于 page :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,或者我应该考虑使用原生支持的数据库?

- 编辑 -

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

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

4 回答 4

9

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

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

值的格式化应该在您的前端完成,或者如果您在检索值时绝对必须在 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 日期和时间戳文字:

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 语句中使用该文字:

于 2012-10-30T15:03:06.233 回答
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 |
+---------------------+
于 2012-10-30T15:08:17.950 回答
1

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

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

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

于 2012-10-30T14:52:11.577 回答
1

使用日期时间或时间戳进行存储的另一个优点。在 phpMyAdmin 或 phpPgAdmin 中,该值显示为字符串,例如 2015-01-22 11:13:42。因此,查找日期要容易得多,就好像它存储为 varchar 或 int 一样。

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

于 2015-01-22T11:13:42.990 回答