MySQL与PostgreSQL的时间类型

1. MySQL的时间类型

 MySQL(5.7)的Timestamp与DateTime类型都是存储时间的数据类型。

Timestamp保存的是UTC时间。数据保存前会根据数据库软件设置的时区(默认随系统),MySQL会将对应传入的时间转化为UTC时间后,再进行保存。

DateTime保存的是没有时区的时间(可以理解为字符串的时间格式)。数据保存时,会原原本本将传入的时间保存下来,不进行任何转换。该类型适合一些本地化系统使用。

实验:
预设条件:以下取orders订单表进行测试,其中created_at 是 Timestamp(3),  updated_at 是 DateTime(3)(实验需要)
测试内容:Timestamp与DateTime的存储数据的区别?及应用场景?

MySQL与PostgreSQL的时间类型_第1张图片
图一 MySQL东8时区的数据展示
MySQL与PostgreSQL的时间类型_第2张图片
图二 MySQL东9时区的数据展示

从图一和图二对比结果可以看出,相同数据在不同时区设置的数据库显示:
1. Timestamp格式的数据是不一样的。但考虑到时区,对应的UTC时间是保持一致的。
2. DateTime格式的数据是不变的。但考虑到时区变化,它对应的UTC时间已经偏离1小时。

也就是说,同一份数据,如果搬到了不同时区的系统,Timestamp对应的UTC时间是一样的,而DateTime实际时间会偏差。

2. PostgreSQL的时间类型

    PostgreSQL在设计命名显得更加通俗易懂,它使用了timestamp和timestamptz分别表达了 MySQL 的DateTime 和 Timestamp。

    PostgreSQL的timestamptz存储时都加上TimeZone,也就是说存储的时间相对UTC时间是不变的。


MySQL与PostgreSQL的时间类型_第3张图片
图三 PostgreSQL的在数据库时区设置为UTC时的数据展示


MySQL与PostgreSQL的时间类型_第4张图片
图四 PostgreSQL的在数据库时区设置为+08:00时区时的数据展示


PostgreSQL的实验结果更清晰,如果是timestamptz类型,它呈现出来都是带时区的。数据库设置为什么时区,就转化为该时区对应的时间。实验结果基本与MySQL一致。

总的来说:
考虑到项目国际化的话,数据库记录的时间需要通过应用呈现给不同时区客户端时,那么建议使用Timestamp,因为该数据类型是有包含时区信息(MySQL默认是UTC)。而且在MySQL数据库, Timestamp数据类型更节省空间。

3. 其它

3.1 数据保存/查询时,输入的时间都需要对应是当前数据库时区的时间,否则找不到对应的记录。

     但是PostgreSQL特殊的地方是,从数据内容可以看出,可以加上时区进行查询,如:
     select * from orders where created_at='2017-07-21 10:20:39.541 +08:00'

3.2 MySQL与PostgreSQL时区的设置(session级别,global并持久化的话需要修改数据库配置)

MySQL:

SELECT @@global.time_zone, @@session.time_zone;

SET @@session.time_zone='+08:00';


PostgreSQL:

show timezone;

set timezone='Asia/Shanghai';

timezone list:https://www.postgresql.org/docs/8.1/static/datetime-keywords.html

你可能感兴趣的:(MySQL与PostgreSQL的时间类型)