Mysql CONVERT_TZ 函数使用及返回NULL解决方案(时区转换问题)

mysql版本:mysql5.6
参考手册:
https://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_convert-tz

一、使用方式:

1.mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
        -> '2004-01-01 13:00:00'
2.mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
        -> '2004-01-01 22:00:00'

二、一般会遇到的问题:

第一种使用方式有时候会返回NULL,原因是mysql的mysql数据库中没有对应的time_zone表

三、可以参考手册的解决方案:
https://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html#time-zone-installation
1.对于Linux, FreeBSD, Solaris, and OS X系统,可以考虑使用系统的time_zone,目录在/usr/share/zoneinfo下面
在shell中执行:mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -ppassword mysql
即可
2.对于所有系统均可的,下载一个官方time_zone包http://dev.mysql.com/downloads/timezones.html
,在shell或cmd中执行:mysql -u root -ppassword mysql < file_name

上面命令执行完成后,最好重启一下mysql服务;
另外,官方手册还提供了几种方案,有兴趣的同学可以点击上面的链接自己学习

个人博客地址

### MySQL 查询中的时区处理方法 在 MySQL 中,时区的处理主要涉及两个方面:全局时区和会话级时区。当执行查询操作时,尤其是涉及到日期和时间的数据时,需要特别注意时区的影响。 #### 1. 查看当前时区设置 可以通过以下 SQL 命令来查看 MySQL 的系统时区以及当前会话使用时区: ```sql SHOW VARIABLES LIKE '%time_zone%'; ``` 此命令返回的结果中 `system_time_zone` 表示服务器的操作系统时区,而 `time_zone` 则表示 MySQL 当前正在使用时区配置[^2]。如果没有显式设置会话级别的时区,则默认使用全局时区。 #### 2. 设置全局时区 为了统一整个数据库实例的时间管理策略,可以调整 MySQL 的全局时区。这通常通过修改配置文件实现,在 `[mysqld]` 部分添加如下行即可完成设定: ```ini [mysqld] default-time-zone='+00:00' ``` 上述例子设置了 UTC 时间作为默认时区[^3]。需要注意的是,更改配置文件之后需重启 MySQL 服务才能生效。 #### 3. 动态改变会话级别时区 对于某些特定需求场景下可能希望仅针对某个客户端连接应用不同的时区规则而不影响其他部分的工作流。此时可通过下面这条指令动态地为单一会话重新定义其内部运作所依据的标准时刻单位——即本地化后的小时偏移量相对于协调世界时(UTC)而言的位置关系表达形式(+/-HH:MM): ```sql SET SESSION time_zone = '+8:00'; -- 将当前会话切换到东八区 (中国标准时间) ``` 或者也可以直接引用已知的名字字符串代替数值型参数: ```sql SET SESSION time_zone = 'Asia/Shanghai'; -- 同样效果但更直观易读的方式指定了具体地理位置关联的城市名作代表 ``` 一旦设定了新的 session-level timezone value, 所有后续在此 connection 上运行的相关 temporal functions 如 NOW(), CURTIME() 等都将基于新选定区域计算得出相应结果. #### 4. 跨时区存储与检索数据 假设有一个记录事件发生瞬间精确至秒数级别的字段 stored_in_utc DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 存在于表 events 中,并且所有写入该列的数据均按照 UTC 记录下来;那么当我们想要以用户所在地区习惯的形式展示这些历史资料的时候就可以利用 CONVERT_TZ 函数来进行转换啦! 例如从原始 utc timestamp 变换成上海当地时间版本呈现给前端界面显示出来: ```sql SELECT event_id, title, description, CONVERT_TZ(stored_in_utc,'+00:00','+08:00') AS local_event_time FROM events; ``` 这里我们调用了内置函数 CONVERT_TZ 来把原本遵循国际通用准则编码保存下来的 datetime 类型变量值映射成目标受众群体熟悉的本土计时体系下的表现形态[^1]^. --- ### 示例代码片段 以下是几个常用的关于时区处理的例子: ```sql -- 查看当前时区配置 SHOW VARIABLES LIKE '%time_zone%'; -- 修改当前会话的时区为北京时间 (+8:00 或 Asia/Shanghai) SET SESSION time_zone = '+8:00'; -- OR SET SESSION time_zone = 'Asia/Shanghai'; -- 使用 CONVERT_TZ 进行跨时区转换 SELECT id, name, CONVERT_TZ(created_at, '+00:00', '+08:00') as created_local_time FROM users; -- 如果想永久变更全局时区,请编辑 my.cnf 文件并重启 MySQL 服务 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值