我应该使用字段“datetime”还是“timestamp”?

你会推荐使用datetime还是timestamp字段,为什么(使用MySQL)?

我在服务器端使用PHP。

答案


MySQL中的时间戳通常用于跟踪对记录的更改,并且每次记录更改时都会更新。如果你想存储一个特定的值,你应该使用日期时间字段。

如果您想要在使用UNIX时间戳或本地MySQL日期时间字段之间做出决定,请使用本机格式。你可以用这种方法在MySQL中进行计算, 如果你想用PHP操作它,当你查询记录的时候("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)"),把值的格式变成UNIX时间戳("SELECT UNIX_TIMESTAMP(my_datetime)")很容易。

  1. 一个重要的区别是DATETIME代表一个日期(如在日历中发现的)和一个时间(可以在挂钟上观察到),而TIMESTAMP代表一个明确定义的时间点。如果您的应用程序处理时区,这可能非常重要。多久以前是’2010-09-01 16:31:00’?这取决于你所处的时区。对我而言,这仅仅是几秒钟之前,对你来说,这可能代表着未来的一段时间。如果我从“1970-01-01 00:00:00 UTC”开始说1283351460秒,那么你确切地知道我在什么时候谈论。(见下面尼尔的优秀答案)。
  2. 另一个区别是:具有“原生”日期时间的查询将不被缓存,但具有时间戳的查询将是。
  3. “MySQL中的时间戳通常用于跟踪对记录的更改”不要以为这是一个好的答案。时间戳比MattBianco和Nir说的要复杂得多。虽然,答案的第二部分是非常好的。这是真实的,这是一个很好的建议。
  4. 还有一个重要的注意事项,DATETIME和TIMESTAMP可以使用CURRENT_TIMESTAMP,NOW()作为默认值,但DATE例如不能,因为默认使用’0000-00-00’,所以为了解决这个问题,U应该写您自己的触发器到该表,插入当前日期(没有时间)在字段/ col与DATE mysql类型。
  5. 文件说, “要指定自动属性,使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP条款”。

在MySQL 5及更高版本中,TIMESTAMP值从当前时区转换为UTC存储,并从UTC转换回当前时区以供检索。(这只发生在TIMESTAMP数据类型,而不是其他类型如DATETIME。

默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置,如MySQL服务器时区支持中所述


除了行元数据(日期创建或修改)以外,我总是使用DATETIME字段。

正如MySQL文档中提到的:

当您需要包含日期和时间信息的值时,使用DATETIME类型。MySQL以’YYYY-MM-DD HH:MM:SS’格式检索并显示DATETIME值。支持的范围是“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。

TIMESTAMP数据类型的范围为’1970-01-01 00:00:01’UTC到’2038-01-09 03:14:07’UTC。它具有不同的属性,具体取决于MySQL版本和服务器运行的SQL模式。

一般使用TIMESTAMP的时间很可能会达到这个下限 – 例如存储生日。


下面的示例显示了如何TIMESTAMP日期类型更改的值后更改time-zone to 'america/new_york'哪里DATETIME是不变的。

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

我已经将我的答案转换为文章,以便更多的人可以找到这个有用的MySQL:Datetime和Timestamp数据类型


主要区别在于DATETIME是恒定的,而TIMESTAMP受time_zone设置的影响。

所以,只有当你或者将来有可能跨时区同步群集时,这一点才是重要的。

简单地说:如果我在澳大利亚有一个数据库,并且转储该数据库以在美国同步/填充数据库,那么TIMESTAMP将更新以反映新时区中事件的实时,而DATETIME会仍然反映在au时区的事件的时间

在应用TIMESTAMP的地方使用DATETIME的一个很好的例子就是在Facebook上,他们的服务器从来不知道跨时区发生了什么事情。一旦我开始谈话,其中有一段时间,我说在发送消息之前,我正在回复消息。(当然,这也可能是由于消息传递软件中的时区翻译错误而造成的,如果这些时间被发布而不是同步的话)。

添加评论

友情链接:蝴蝶教程