MySQL 中各种日期/时间字段类型的优缺点是啥?

Posted

技术标签:

【中文标题】MySQL 中各种日期/时间字段类型的优缺点是啥?【英文标题】:What are the pros and cons of the various date/time field types in MySQL?MySQL 中各种日期/时间字段类型的优缺点是什么? 【发布时间】:2010-10-02 23:03:42 【问题描述】:

mysql 中的日期和时间可以存储为 DATETIME、TIMESTAMP 和 INTEGER(自 1970 年 1 月 1 日以来的秒数)。各自的优缺点是什么,尤其是在 LAMP 堆栈下开发时?

【问题讨论】:

【参考方案1】:

TIMESTAMP 存储在 MySQL 专有方法中(尽管它基本上只是一个由年、月、日、小时、分钟和秒组成的字符串),此外,每当插入或更改记录时,TIMESTAMP 类型的字段都会自动更新并且没有给出明确的字段值:

mysql> create table timestamp_test(
    id integer not null auto_increment primary key, 
    val varchar(100) not null default '', ts timestamp not null); 
Query OK, 0 rows affected (0.00 sec)

mysql> insert into timestamp_test (val) values ('foobar');
Query OK, 1 row affected (0.00 sec)

mysql> select * from timestamp_test;
+----+--------+----------------+
| id | val    | ts             |
+----+--------+----------------+
|  1 | foobar | 20090122174108 |
+----+--------+----------------+
1 row in set (0.00 sec)

mysql> update timestamp_test set val = 'foo bar' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from timestamp_test;
+----+---------+----------------+
| id | val     | ts             |
+----+---------+----------------+
|  1 | foo bar | 20090122174123 |
+----+---------+----------------+
1 row in set (0.00 sec)

mysql> 

DATETIME 是日期和时间的标准数据类型,它与 MySQL 中的日期和时间函数一起使用。我可能会在实践中使用它

不建议以 INTEGER 格式存储日期,因为由于时区、闰年等有趣的问题,您正在打开一个真正的蠕虫罐 - 至少如果您打算根据存储在那个字段。

【讨论】:

非常感谢您,例如自动更改字段。知道这一点非常重要(至少对我而言)。【参考方案2】:

我会使用 MySQL 中的 DATETIME 或 DATE 字段来保存数据。至少,如果您要将日期值存储到 2038 年:http://en.wikipedia.org/wiki/Year_2038_problem。如果您使用的系统以不同方式存储整数,则可能不会遇到此问题。

比较日期值甚至时间戳仍然很容易。

SELECT * FROM myTable WHERE startDate > '2009-01-01'
SELECT * FROM myTable WHERE UNIX_TIMESTAMP(startDate) > 1232541482

【讨论】:

【参考方案3】:

好吧,我想以下内容将有助于澄清。

日期和时间可以存储在 mysql 的 DATETIME 字段中。

如果您希望在创建行时添加时间戳,则使用 TIMESTAMP - 该字段将在创建时自动填写。

对 Date 使用整数有点矫枉过正,因为这实际上是 DATETIME 所做的,但会为您完成所有耗时的转换。

您是否有兴趣了解某个特定的优点或缺点?

【讨论】:

【参考方案4】:

mysql 中的时间戳可能非常棘手。如果没有仔细声明,您最终可能会得到在每次更新行时自动更改其值的字段(即使您没有显式更新它)。

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

【讨论】:

【参考方案5】:

如果您需要时间戳的毫秒级保真度,则需要将其保存为整数。不过要小心,这会使事情复杂化。

【讨论】:

以上是关于MySQL 中各种日期/时间字段类型的优缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java Date时间的各种转换方式和Mysql存时间类型字段的分析

关于MYSQL 时间类型存储在数据库里是啥类型

日期时间 vs 日期和时间 Mysql

mysql 日期和时间问题 求助

mysql 中,创建表时如何定义一个日期类型的字段

mysql记录根据日期字段倒序输出