如何将时区偏移值(例如“-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
所以我有一个 MySQL 5.7 数据库,它在两个单独的列中存储 UTC 时间戳和时区偏移量。时区在 timezone
中,偏移量在 offset
.
据我了解,我可能会通过 运行 使用 CONVERT_TZ
:
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)));
虽然这个问题的原始答案很有帮助,但用户留下的评论“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