如何将时区偏移值(例如“-0400”)转换为带有冒号的值(例如 MySQL 中的“-04:00”)?

How to convert a timezone offset value such as “-0400” to one that has a colon like “-04:00” in MySQL?

所以我有一个 MySQL 5.7 数据库,它在两个单独的列中存储 UTC 时间戳和时区偏移量。时区在 timezone 中,偏移量在 offset.

据我了解,我可能会通过 运行 使用 CONVERT_TZ:

之类的命令来获取计算出的非 UTC 时间的实际偏移量
CONVERT_TZ(`timestamp`,'+00:00',`offset`)

但我面临的问题是偏移值的存储没有用冒号分隔小时和分钟,如下所示:-0400.

为了能够正确使用 CONVERT_TZ,我需要以某种方式将 -0400 更改为 -04:00,但如何更改?有正则表达式方法吗?

我可能会使用 REPLACE 做这样的事情,但那看起来仍然草率:

CONVERT_TZ(`timestamp`,'+00:00',REPLACE(`offset`,'00',':00'))

要在偏移列中插入冒号,您可以使用以下命令:

CONVERT_TZ(`timestamp`,'+00:00',CONCAT(LEFT(`offset`, LENGTH(`offset`)-2),':',RIGHT(`offset`,2)));

虽然这个问题的原始答案很有帮助,但用户留下的评论“” was even more helpful. It uses the INSERT() string function 有了它,我能够设计出以下内容并且效果很好!

CONVERT_TZ(`timestamp`,'+00:00',INSERT(`offset`,LENGTH(`offset`)-1,0,':'));

这些是使用具有以下示例时间戳和相关偏移量的结果:

SELECT CONVERT_TZ('2018-05-28 02:34:58','+00:00',INSERT('+0300',LENGTH('+0300')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 07:50:12','+00:00',INSERT('+0400',LENGTH('+0400')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 09:23:34','+00:00',INSERT('+0530',LENGTH('+0530')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 12:16:56','+00:00',INSERT('+1000',LENGTH('+1000')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 16:07:17','+00:00',INSERT('-0200',LENGTH('-0200')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 20:02:05','+00:00',INSERT('-0700',LENGTH('-0700')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 23:33:03','+00:00',INSERT('-1000',LENGTH('-1000')-1,0,':'));
SELECT CONVERT_TZ('2018-05-28 23:33:03','+00:00',INSERT('-0000',LENGTH('-0000')-1,0,':'));

结果如下:

  • 2018-05-28 02:34:58 偏移量 +0300 变为:2018-05-28 05:34:58
  • 2018-05-28 07:50:12 偏移量 +0400 变为:2018-05-28 11:50:12
  • 2018-05-28 09:23:34 偏移量 +0530 变为:2018-05-28 14:53:34
  • 2018-05-28 12:16:56 偏移量为 +1000 变为:2018-05-28 22:16:56
  • 2018-05-28 16:07:17 偏移量 -0200 变为:2018-05-28 14:07:17
  • 2018-05-28 20:02:05 偏移量 -0700 变为:2018-05-28 13:02:05
  • 2018-05-28 23:33:03 偏移量为 -1000 变为:2018-05-28 13:33:03
  • 2018-05-28 23:33:03 偏移量 -0000 变为:2018-05-28 23:33:03