我应该使用字段“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)")
很容易。
- 一个重要的区别是
DATETIME
代表一个日期(如在日历中发现的)和一个时间(可以在挂钟上观察到),而TIMESTAMP
代表一个明确定义的时间点。如果您的应用程序处理时区,这可能非常重要。多久以前是’2010-09-01 16:31:00’?这取决于你所处的时区。对我而言,这仅仅是几秒钟之前,对你来说,这可能代表着未来的一段时间。如果我从“1970-01-01 00:00:00 UTC”开始说1283351460秒,那么你确切地知道我在什么时候谈论。(见下面尼尔的优秀答案)。 - 另一个区别是:具有“原生”日期时间的查询将不被缓存,但具有时间戳的查询将是。
- “MySQL中的时间戳通常用于跟踪对记录的更改”不要以为这是一个好的答案。时间戳比MattBianco和Nir说的要复杂得多。虽然,答案的第二部分是非常好的。这是真实的,这是一个很好的建议。
- 还有一个重要的注意事项,DATETIME和TIMESTAMP可以使用CURRENT_TIMESTAMP,NOW()作为默认值,但DATE例如不能,因为默认使用’0000-00-00’,所以为了解决这个问题,U应该写您自己的触发器到该表,插入当前日期(没有时间)在字段/ col与DATE mysql类型。
- 文件说, “要指定自动属性,使用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上,他们的服务器从来不知道跨时区发生了什么事情。一旦我开始谈话,其中有一段时间,我说在发送消息之前,我正在回复消息。(当然,这也可能是由于消息传递软件中的时区翻译错误而造成的,如果这些时间被发布而不是同步的话)。
Related Posts

c++ – Why should I always enable compiler warnings?

exception handling – Python try-else
