[php] 我应该在MySQL中使用日期时间或时间戳数据类型吗?



Answers

在MySQL 5及更高版本中, TIMESTAMP值从当前时区转换为UTC以存储,并从UTC转换回当前时区以供检索。 (这仅出现在TIMESTAMP数据类型中, 而不适用于其他类型,如DATETIME。)

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

Question

你会推荐使用datetime datetimedatetime字段,以及为什么(使用MySQL)?

我正在服务器端使用PHP。




TIMESTAMP is useful when you have visitors from different countries with different time zones. you can easily convert the TIMESTAMP to any country time zone




当您在表上执行UPDATE语句时,请注意更改时间戳。 如果您有一个包含'Name'(varchar),'Age'(int)和'Date_Added'(时间戳)列的表,并且运行以下DML语句

UPDATE table
SET age = 30

那么'Date_Added'列中的每个值都会更改为当前时间戳。




在MySQL中值得注意的是,在创建表列时,您可以使用下面的内容:

on update CURRENT_TIMESTAMP

这将更新每个修改行的实例的时间,有时对存储的最后编辑信息非常有用。 这只适用于时间戳,而不是日期时间。




时间戳和日期时间之间的另一个区别是在时间戳中,您不能将默认值设置为NULL。




In my case, I set UTC as a time zone for everything: the system, the database server, etc. every time that I can. If my customer requires another time zone, then I configure it on the app.

I almost always prefer timestamps rather than datetime fields, because timestamps include the timezone implicitly. So, since the moment that the app will be accessed from users from different time zones and you want them to see dates and times in their local timezone, this field type makes it pretty easy to do it than if the data were saved in datetime fields.

As a plus, in the case of a migration of the database to a system with another timezone, I would feel more confident using timestamps. Not to say possible issues when calculating differences between two moments with a sumer time change in between and needing a precision of 1 hour or less.

So, to summarize, I value this advantages of timestamp:

  • ready to use on international (multi time zone) apps
  • easy migrations between time zones
  • pretty easy to calculate diferences (just subtract both timestamps)
  • no worry about dates in/out a summer time period

For all this reasons, I choose UTC & timestamp fields where posible. And I avoid headaches ;)




参考本条:

主要区别:

TIMESTAMP用于跟踪对记录的更改,并在每次更改记录时进行更新。 DATETIME用于存储不受记录中任何更改影响的特定值和静态值。

TIMESTAMP也受到不同时区相关设置的影响。 DATETIME是不变的。

TIMESTAMP内部将当前时区转换为UTC存储,并在检索过程中转换回当前时区。 DATETIME无法执行此操作。

TIMESTAMP支持的范围:'1970-01-01 00:00:01'UTC至'2038-01-19 03:14:07'UTC DATETIME支持的范围:'1000-01-01 00:00:00'至'9999 -12-31 23:59:59'




时间戳记数据类型存储日期和时间,但是采用UTC格式,而不是日期时间的当前时区格式。 当你获取数据时,时间戳再次将其转换为当前时区时间。

因此,假设您在美国并从美国时区的服务器获取数据。 然后您将根据美国时区获取日期和时间。 时间戳数据类型列在更新行时总是自动更新。 因此,跟踪上次更新特定行的时间会很有用。

欲了解更多详情,你可以阅读博客文章Timestamp Vs Datetime




DATETIME,TIMESTAMP和DATE之间的比较

那是什么[.fraction]?

  • DATETIME或TIMESTAMP值可以包含最大微秒(6位数)精度的尾随小数秒部分。 特别是,插入到DATETIME或TIMESTAMP列的值中的任何小数部分都被存储而不是丢弃。 这当然是可选的。

资料来源:




TIMESTAMP始终使用UTC(即自1970-01-01以来以秒计),并且您的MySQL服务器将其自动转换为服务器时区的日期/时间。 从长远来看,TIMESTAMP是要走的路,因为你知道你的时态数据总是用UTC。 例如,如果您迁移到其他服务器或更改服务器上的时区设置,则不会影响日期。




  1. 对于DATETIME,TIMESTAMP是四个字节与八个字节。

  2. 数据库中的时间戳也更轻,索引更快。

  3. 如果您需要包含日期和时间信息的值,则使用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模式。

  1. DATETIME是恒定的,而TIMESTAMP受time_zone设置的影响。



我在语义基础上做出这个决定。

当我需要记录(或多或少)固定时间时,我使用时间戳。 例如,当记录被插入到数据库中或发生某些用户操作时。

日期/时间可以任意设置和更改时使用日期时间字段。 例如,用户可以保存稍后的更改约会。




下面的例子展示了TIMESTAMP日期类型在DATETIME不变time-zone to 'america/new_york'下将time-zone to 'america/new_york'更改time-zone to 'america/new_york'后如何更改值。

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数据类型




取决于应用,真的。

考虑设置用户在纽约的服务器的时间戳,在桑海进行预约。 现在,当用户在Sanghai连接时,他从东京的镜像服务器访问相同的预约时间戳。 他将在东京时间看到这个约会,从原来的纽约时间偏移。

因此,对于像约会或时间表那样代表用户时间的值,日期时间更好。 无论服务器设置如何,它都允许用户控制所需的确切日期和时间。 设定时间是设定时间,不受服务器时区,用户时区或夏时制时间计算方式的变化影响(是的,它会改变)。

另一方面,对于代表系统时间的值,如支付交易,表格修改或记录,始终使用时间戳。 将服务器移至其他时区或在不同时区的服务器之间进行比较时,系统不会受到影响。

数据库中的时间戳也更轻,索引更快。




我喜欢Unix时间戳,因为你可以转换为数字,只需要担心数字。 再加上/减去并得到持续时间等等。然后以任何格式将结果转换为日期。 此代码可以找出文档中的时间戳与当前时间之间以分钟为单位的时间。

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);



Related