Таким образом, у меня есть база данных MySQL 5.7, которая хранит временную метку UTC, а также смещение часового пояса в двух отдельных столбцах. Часовой пояс находится в timezone
а смещение offset
.
Из того, что я понимаю, я могу потенциально получить фактическое смещение, рассчитанное не-UTC, запустив команду, например, используя CONVERT_TZ
:
CONVERT_TZ('timestamp','+00:00','offset')
Но проблема Im сталкивается с тем, что значение смещения хранится без двоеточия, отделяющего часы от минут следующим образом: -0400
.
Чтобы иметь возможность правильно использовать CONVERT_TZ
мне нужно как-то изменить -0400
на -04:00
, но как? Есть ли метод регулярных выражений?
Я мог бы сделать что-то подобное с помощью REPLACE
, но это все еще кажется неаккуратным:
CONVERT_TZ('timestamp','+00:00',REPLACE('offset','00',':00'))
Хотя первоначальный ответ на этот вопрос был полезен, комментарий, оставленный пользователем " Michael - sqlbot ", был еще более полезным. Он использует функцию строки INSERT()
и с этим я смог разработать следующее, и он отлично работает!
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
Чтобы вставить двоеточие в столбце смещения, вы можете использовать следующее:
CONVERT_TZ('timestamp','+00:00',CONCAT(LEFT('offset', LENGTH('offset')-2),':',RIGHT('offset',2)));
REPLACE
но, тем не менее, хорошее решение.