mysql之关于CST和GMT时区时间转换方式

 更新时间:2023年10月12日 10:02:21   作者:飞廉灬少将  
这篇文章主要介绍了mysql之关于CST和GMT时区时间转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

今天在往数据库查询一条数据时突然发现插入的时间竟然比系统时间少了13个小时。。。

然后因为插入时间的问题延伸出之前写的SQL中只要涉及到创建时间都有可能存在,也就是某月1号插入的数据,你在统计时,当月并未统计,实际上是在上个月的统计数据中。。。。

这就尴尬了。。。

排查

1、首先查证测试环境数据库时区:

SHOW VARIABLES LIKE ‘%time_zone%'

竟然设置的CST时区,之前不是啊,之后询问主管才得知,当前改造的老项目生产环境的数据库使用的CST。。。

为了保证测试一致性,就修改了数据库时区。。。

到此,直接找到时间相差13个小时的原因。。。。

解决

既然知道时间差,也知道时区了,那么问题就好解决了,

mysql中有一个函数CONVERT_TZ() 可以解决这个问题(这里为了更直观,直接贴图)

通过这条SQL查询出来的时间

SELECT report_id,create_time FROM report_item WHERE report_id=2584

结果:

上图中的时间就是CST时区时间,单实际上系统时间是:2021-05-21 10:05:12,相差足足13个小时

所以SQL修改为:

SELECT report_id,CONVERT_TZ(create_time, 'UTC','+13:00') as create_time FROM report_item WHERE report_id=2584

到这里,基本完美解决了时区转换问题,后来度娘了一下这个问题,发现CST和GMT时间相差是13或14小时,至于是13小时还是14小时,取决于你传递给数据库的时间

函数介绍:CONVERT_TZ(dt,from_tz,to_tz)

转换datetime值dt,从 from_tz 由给定转到 to_tz 时区给出的时区,并返回的结果值。

如果参数无效该函数返回NULL。

示例

yyyy-MM-dd格式

SELECT CONVERT_TZ('2021-5-21 15:30:00','UTC','+13:00') AS 北京时间;

这里注意一点,我的SQL时区是CST,但是我在这里用的UTC来作为标准时间,所以可以理解CST-UTC-GMT,所以最后我用了+13:00,这里也可能会有人问为什么不直接用CST来转,这个嘛。。。

可能是我mysql版本问题?

我直接写CST,竟然返回给我一个null。。。尴尬。。。

使用这样的写法可以解决现在的问题,但是最重要的一点就是从根源上去解决,不要去给数据库设置默认时区,如果一定要,那设置GMT或者UTC都可以,不用使用CST时区,因为这个时区存在很多很多的问题,这里就不意义赘述了。。。

大家可以去找度娘要关于CST时区的问题

总结

1、数据库时区最好不要设置成CST,以免出现上面的错误

2、当数据库中的时间用的是时间类型时候,Java中可以用String,但是这种做法不是很国际化

3、在数据库连接字符串中设置时区。

推荐这种方式,如下:

jdbc:mysql://xxxx:3306/table_name?serverTimezone=Asia/ShanghaiallowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 阿里面试MySQL死锁问题的处理

    阿里面试MySQL死锁问题的处理

    这篇文章主要介绍了在阿里面试中的一个问题MySQL死锁问题的处理回答,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议
    2022-03-03
  • MySQL事务视图索引备份和恢复概念介绍

    MySQL事务视图索引备份和恢复概念介绍

    这篇文章主要介绍了MySQL事务、视图、索引、备份和恢复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • MySQL 回表,覆盖索引,索引下推

    MySQL 回表,覆盖索引,索引下推

    这篇文章主要介绍了MySQL 回表,覆盖索引,索引下推,就是我们需要查询的数据都在二级索引树中,直接返回这种情况就叫做覆盖索引
    2022-07-07
  • Mysql巧用join优化sql的方法详解

    Mysql巧用join优化sql的方法详解

    这篇文章主要给大家介绍了关于Mysql巧用join优化sql的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 详解MySQL查看执行慢的SQL语句(慢查询)

    详解MySQL查看执行慢的SQL语句(慢查询)

    查看执行慢的SQL语句,需要先开启慢查询日志,MySQL的慢查询日志,记录在MySQL中响应时间超过阀值的语句(具体指运行时间超过long_query_time值的SQL,本文给大家介绍MySQL查看执行慢的SQL语句,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • mysql-8.0.15-winx64安装与修改密码方式

    mysql-8.0.15-winx64安装与修改密码方式

    本文提供了详细的MySQL安装步骤,包括下载、安装、配置环境变量、启动服务和初始化数据库,首先,从MySQL官网下载压缩包并解压,其次,将bin目录添加到系统PATH中,接着,创建my.ini文件进行配置,并正确放置于指定目录,通过CMD以管理员身份执行安装和初始化命令
    2024-10-10
  • mysql5.6建立索引报错1709问题及解决

    mysql5.6建立索引报错1709问题及解决

    这篇文章主要介绍了mysql5.6建立索引报错1709问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • MySQL中json字段的操作方法

    MySQL中json字段的操作方法

    这篇文章主要介绍了MySQL中json字段的操作方法,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • 基于MySQL在磁盘上存储NULL值

    基于MySQL在磁盘上存储NULL值

    这篇文章主要介绍了基于MySQL在磁盘上存储NULL值,NULL值列表,一行数据里可能有的字段值是NULL,比如nickname字段,允许为NULL,存储时,如果没赋值,这字段值就是NULL,下文关于NULL值的相关资料,需要的小伙伴可以参考一下
    2022-02-02
  • innodb存储引擎修改表共享空间为独立空间

    innodb存储引擎修改表共享空间为独立空间

    最近在优化mysql innodb存储引擎,把共享表空间转换成独立表空间,下面是详细步骤
    2014-01-01

最新评论