您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
当前回答
到目前为止,还没有提到DEFAULT CURRENT_TIMESTAMP只适用于时间戳,而不适用于DateTime类型字段。
这与只能使用DateTime而不能使用Timestamp的MS Access表相关。
其他回答
我是基于语义做出这个决定的。
当我需要记录(或多或少)固定时间点时,我使用时间戳。例如,当记录被插入到数据库中时,或者当发生某些用户操作时。
当可以任意设置和更改日期/时间时,我使用datetime字段。例如,当用户可以保存以后的更改约会时。
这里的许多答案都建议将时间戳存储为时间戳,以防必须表示定义良好的时间点。但是,如果您按照惯例将所有时间点都存储在UTC中,那么您也可以使用datetime获取时间点。
这取决于应用程序。
考虑由用户在纽约的服务器上设置时间戳,以便在桑海进行约会。现在,当用户在桑海连接时,他从东京的镜像服务器访问相同的预约时间戳。他将在东京时间看到这一任命,而不是原定的纽约时间。
因此,对于表示用户时间(如约会或日程)的值,datetime更好。它允许用户控制所需的确切日期和时间,而不考虑服务器设置。设置时间是设置时间,不受服务器时区、用户时区或夏时制计算方式变化的影响(是的,它会变化)。
另一方面,对于表示系统时间的值,如支付事务、表修改或日志记录,始终使用时间戳。将服务器移动到另一个时区或在不同时区的服务器之间进行比较时,系统不会受到影响。
时间戳在数据库上也更轻,索引速度更快。
2016+:我建议您将Mysql时区设置为UTC,并使用DATETIME:
任何最近的前端框架(Angular 1/2、react、Vue…)都可以轻松自动地将UTC日期时间转换为本地时间。
此外:
DATETIME现在可以自动设置为当前时间值。如何设置MySQL DATETIME列的默认值?与人们可能认为的相反,DATETIME比TIMESTAMP快,http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/TIMESTAMP仍然限于1970-2038
(除非您可能更改服务器的时区)
AngularJs示例
// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...
// font-end Output the localised time
{{item.my_datetime | date :'medium' }}
此处提供所有本地化时间格式:https://docs.angularjs.org/api/ng/filter/date
以下示例显示了在将时区更改为“america/new_york”(DATETIME不变)后,TIMESTAMP日期类型如何更改值。
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:日期时间与时间戳数据类型。