MySQL 中的日期和时间可以存储为 DATETIME、TIMESTAMP 和 INTEGER(自 1970 年 1 月 1 日以来的秒数)。每种方法的优缺点是什么,尤其是在 LAMP 堆栈下开发时?
5 回答
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 格式存储日期,因为由于时区、闰年等有趣的问题,您正在打开一个真正的蠕虫罐 - 至少如果您打算根据存储在该字段中的特定日期查询数据库。
我会使用 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
好吧,我想以下内容将有助于澄清。
日期和时间可以存储在 mysql 的 DATETIME 字段中。
如果您希望在创建行时添加时间戳,则使用 TIMESTAMP - 该字段将在创建时自动填写。
对 Date 使用整数有点矫枉过正,因为这本质上是 DATETIME 所做的,但会为您完成所有耗时的转换。
您是否有兴趣了解某个特定的优点或缺点?
mysql 中的时间戳可能非常棘手。如果没有仔细声明,您最终可能会得到在每次更新行时自动更改其值的字段(即使您没有明确更新它)。
如果您需要时间戳的毫秒保真度,则需要将其保存为整数。不过要小心,这会使事情复杂化。