如何转换时区偏移值,如“-0400&x201D;一个有冒号的“-04:00”;在MySQL中?

如何转换时区偏移值,如“-0400&x201D;一个有冒号的“-04:00”;在MySQL中?,mysql,timestamp,timezone-offset,mysql-5.7,Mysql,Timestamp,Timezone Offset,Mysql 5.7,因此,我有一个MySQL 5.7数据库,它在两个单独的列中存储UTC时间戳和时区偏移量。时区在时区中,偏移量在偏移量中 据我所知,通过运行以下命令,我可以获得非UTC时间计算的实际偏移量: 但我面临的问题是,存储偏移量值时没有用冒号将小时与分钟分开,如下所示:-0400 为了能够正确地使用转换,我需要以某种方式将-0400更改为-04:00,但如何更改?有正则表达式方法吗 我可能会用它来做类似的事情,但这看起来仍然很草率: CONVERT_TZ(`timestamp`,'+00:00',REPL

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

据我所知,通过运行以下命令,我可以获得非UTC时间计算的实际偏移量:

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

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

我可能会用它来做类似的事情,但这看起来仍然很草率:

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

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

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

虽然这个问题的原始答案很有帮助,但用户“”留下的评论更有用。它使用了和,我能够设计以下,它的作品伟大

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,':'));
结果如下:

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

很好的解决方案!不太确定它是否比
REPLACE
更可靠,但这是一个很好的解决方案。RELPACE的问题是,它不适用于所有不按小时对齐的时区。印度是最重要的例子,是+5:30“印度是最重要的例子,是+5:30”好的,这是一个很好的观点,并将其作为答案,因为它解决了这个问题。谢谢你的回答和澄清。或者<代码>转换(`timestamp`,'+00:00',插入(偏移量,长度(偏移量)-2,0',:'))
。。。删除len-2处的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,':'));