前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql: 多时区的聚合统计

mysql: 多时区的聚合统计

作者头像
菩提树下的杨过
发布2020-10-29 10:59:33
1.9K0
发布2020-10-29 10:59:33
举报

通常我们在安装mysql实例时,都是使用默认的时区(中国大陆的服务器,通常就是GMT+8北京时区),随着业务的发展,如果业务实现了全球化,需要支持(多时区)按当地时间来汇总数据时,就会涉及到时区转换问题。

比如,有下面这张订单表(为简化问题,仅保留了id、下单时间2个字段) - 注:mysql实例为GMT+8时区

按北京时间汇总每天的订单记录数,sql语句如下:

代码语言:javascript
复制
SELECT 
	COUNT(0),DATE_FORMAT(order_time,'%Y-%m-%d') 
FROM t_order 
GROUP BY DATE_FORMAT(order_time,'%Y-%m-%d');

如果按GMT+1时区(即:欧洲地区)来统计的话,上面的数据就不对了,欧洲地区比北京时间早7小时,即:北京时间 2020-10-25 00:00:00,对应于欧洲当地时间 2020-10-24 17:00:00,把这几条记录的order_time转换一下,得到如下表格:

id

order_time(GMT+8)

order_time(GMT+1)

1

2020-10-25 01:00:01.000

2020-10-24 18:00:01.000

2

2020-10-25 02:00:01.000

2020-10-24 19:00:01.000

3

2020-10-25 20:00:01.000

2020-10-25 13:00:01.000

4

2020-10-25 23:00:01.000

2020-10-25 16:00:01.000

5

2020-10-26 02:00:01.000

2020-10-25 19:00:01.000

6

2020-10-26 05:00:01.000

2020-10-25 22:00:01.000

7

2020-10-26 11:00:01.000

2020-10-26 04:00:01.000

8

2020-10-26 15:00:01.000

2020-10-26 08:00:01.000

9

2020-10-26 20:00:01.000

2020-10-26 13:00:01.000

很明显,按欧洲当地时间来看,24号2条记录,25号4条记录,26号3条记录。幸好,mysql提供了一个CONVERT_TZ函数,可以用于时区转换,基本用法如下:

上面的语句,将GMT+8北京时间2020-10-25 00:00:00,转换成GMT+1欧洲时间2020-10-24 17:00:00,有了这个利器,最开始的sql可以改成:

代码语言:javascript
复制
SELECT 
	COUNT(0),DATE_FORMAT(CONVERT_TZ(order_time, '+08:00', '+01:00'),'%Y-%m-%d') 
FROM t_order 
GROUP BY DATE_FORMAT(CONVERT_TZ(order_time, '+08:00', '+01:00'),'%Y-%m-%d');

参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_convert-tz

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档