mysql计算时间差小时_MySQL中时区内容的理解(一)

一、时区变量:在MySQL中有两个关于时区的变量: time_zonesystem_time_zone。他们对我们数据库的插入、查询、更新有着重要的关系。

如何查看这两个环境变量的值:

show global variables like '%time_zone%';

4586180a8b108fe9b851e66924a00951.png

其中,如果 time_zoneSYSTEM,就表示使用 system_time_zone的值,如果是其他的值,例如是+8:00,就表示使用中国时区。它就会忽略 system_time_zone变量的值,直接使用time_zone设置的值。 system_time_zone可以理解成全局参数,当我们 启动MySQL的时候,Mysql会试图确定当前系统的时区,并这个时区设置system_time_zone变量,注意:system_time_zone变量是不可以修改的,如果想要改变时区,修改time_zone变量的值。
set global time_zone="+8:00";## 断开连接exit;
想要设置的时区生效,我们需要断开MySQL连接,然后重新连接MySQL, 不需要重启MySQL。网上还说使用下面命令:( 注意:我使用这种方式没有生效)
## 我使用没有生效(我的MySQL版本是:8.0.20)flush privileges;

二、now()函数与时区之间的关系

now()不仅与 当前系统时间和时区有关系,还和 MySQL中设置的时区有关系。可以这样说:now()函数的结果由这两部分组合而成。还有CURRENT_TIMESTAMP()函数也是一样。now()函数的结果计算过程:
    • 首先获取当前系统的时区以及时间

    • 然后将上面获取的时间(带有时区信息的时间)转化为MySQL的time_zone变量设置的时区时间。形成最终结果。

为了简化理解,我们假设系统的时区是 +8:00 。 首先查看系统时区:(macbook系统上)
# 查看时区sudo systemsetup -gettimezone# 查看时间date

34a624946c781f9f5e71380b9adca18c.png

下面是两个不同MySQL的time_zone时区的例子:
  1. 假设MySQL的时区也是+8:00的话,则now()就表示当前系统时间,因为时区没有改变。

    a.查看系统时间:

    014446455c3ab099938194ebce101e1d.png

    b.设置MySQL的时区为+8:00的时区,需要重新连接MySQL

    60e9ddff17598affc0348cbed53b007c.png

    c.查看now函数结果

    dc798023e2b0b6540eb195e995ce6366.png

    结论:从第一个和第三个可以看出now()函数(MySQL)与date(系统时间)差不多,时间差是由于中间参数问题。

  2. 假设MySQL的时区是+0:00的话(伦敦时区),则now()函数的结果要比当前系统时间少8个小时。因为要从+8:00时区转化为+0:00的时区,所以就少了8个小时。

    a.查看当前系统时间:

    7bca35bd4d50fb7779c7666fa0eed55d.png

    b.查看MySQL时区:

    50c88491a58f13c8502789e81f615173.png

    c.查看MySQL时间:

    ff981afb24bd762cc0389fb1657a35ae.png

    结论:可以看出MySQL中的now函数比系统中的date函数少了8个小时。这是因为系统的时区为+8:00,进入到MySQL时,需要将+8:00表示的时间转化为+0:00的时间,所以少了8个小时

三、timestamp字段与时区之间的关系

timestamp字段与时区也有着重要的关系。timestamp字段的值会随着MySQL的time_zone变化而变化。timestamp字段的值会随着MySQL的time_zone变化而变化。timestamp字段的值会随着MySQL的time_zone变化而变化。例子:
  1. 当前MySQL的时区:并设置为+0:00时区。

    0b1241dfc99aa17d4d916bb78e9cd063.png

  2. 表结构如下:有三个字段,一个主键、一个timestamp的字段、一个datetime的字段:(设置两个时间用于比较这两个字段之间的区别)

    57e4b9d7de9ef17569ad017556e581e5.png

  3. 插入一条数据内容,并查看数据结果,插入一条时间为:2020-12-25 22:12:56时间的记录

    94984c2bb04f479c975de127b9cc7336.png

  4. 修改MySQL的时区,设置为+8:00时区

    fd08fb0f2c8ef588e406aaa62a84f0e3.png

  5. 查看数据结果

    a6e86df3c273f785555f44b3efed4827.png

结论:从上面的示例我们可以看出:我们在插入数据 之前的时区为: +0:00,并插入一条时间为“2020-12-25 22:12:56”的记录,然后修改了时区为: +8:00,这时再查看原来的记录,发现timeStamp字段的时间加了8个小时,而datetime字段的内容没有发生变化。我们可以将timestamp理解成 带有时区的时间,我理解是:timestamp字段在插入数据的时候,会根据当前时区(本示例为:+0:00)将我们的插入的时间转化为GMT+0的时间。也就是根据 插入时候的时区以及 时间数据转化为GMT+0的时区的毫秒数。然后显示的时候,会将这个GMT+0转化为 当前查询时候的时区的时间(本示例为+8:00)。而datetime字段可以理解成静态数据,可以理解成插入了一个字符串数据内容,不会随着时区的变化而变化。

四、datetime与时区之间的关系

datetime、date、time字段都与时区没有任何关系,不会随着时区的变化而变化。 如果硬说datetime、date、time与Mysql时区有关系,那么只会在一个时候有关系:就是插入数据,并且使用now()函数进行插入。 准确的说:datetime、date、time和时区还是没有关系,只是这个now函数与时区有关系,所以这三个字段看似就与时区有关系了。 因为now函数会根据当前系统时间和系统时区,转化为MySQL时区的时间,所以now就是当前时区的函数,在插入datetime字段的时候,就是当前时区的时间了。所以看似有了关系。 在插入之后,以后无论时区如何变化,都不会影响datetime、date、time字段记录的内容。 注意事项:
  • 我们通过`set global time_zone`方式修改MySQL的时区,会在MySQL重启的时候恢复。我们必须修改配置文件中的默认时区变量default_time_zone.

  • timestamp字段与时区有着重要关系,该字段会随着时区的变化而变化。

  • datetime、date、time字段与时区没有关系,不会随着时区的变化而变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值