2014-10-06 1 views
1

Я создал веб-приложение, которое в настоящее время используется рядом клиентов. В версии 1.0 он не поддерживал часовые пояса и сохранял все данные в Европе/Амстердаме. Теперь в v1.2 он хранит все даты в UTC и показывает правильную дату в веб-приложении в соответствии с выбранным часовым поясом пользователя.Преобразование всех полей datetime в UTC

Теперь я хочу предоставить запрос mysql для моих клиентов (которые обновляют и уже имеют некоторые данные), чтобы обновить все поля datetime до UTC в phpmyadmin. Я использую CakePHP, поэтому все созданные/измененные поля необходимо обновить. Может ли кто-нибудь показать мне, как выглядит этот запрос?

ответ

1

Вы можете использовать функции преобразования часового пояса, предоставляемые самой MySQL:

-- "table" and "field" are obviously placeholders 
UPDATE table SET field = CONVERT_TZ(field, 'Europe/Amsterdam', 'UTC'); 

Не забудьте сделать резервную копию первого.

Обратите внимание, что CONVERT_TZ требует, чтобы MySQL знал о часовых поясах. Вы import them to the database с помощью простой команды оболочки может (требует корневого доступа к БД):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p -D mysql 

Это может быть сделано несколько раз, так что это не больно, чтобы выполнить его, если вы не знаете, если есть временные зоны уже импортированы. Обычно вы можете игнорировать предупреждения о некоторых неясных часовых поясах.

+0

Хорошо, это работает, спасибо! Для событий start_date и start_time хранятся отдельно. Могу ли я присоединиться к этим полям, конвертировать их в UTC и хранить их отдельно в одном запросе? – Matish

+0

Да, это должно сработать. В основном вы можете использовать синтаксис 'CONVERT_TZ (поле, 'Европа/Амстердам', 'UTC')', где вы можете использовать 'поле'. – lxg

+0

Спасибо, это сработало для меня: UPDATE 'events' SET ' start_date' = CONVERT_TZ (concat ('start_date', '',' start_time'), '+02: 00', '+00: 00') , 'start_time' = CONVERT_TZ (concat (' start_date', '', 'start_time'), '+02: 00', '+00: 00'), ' end_date' = CONVERT_TZ (concat ('end_date', '', 'end_time'), '+02: 00', '+00: 00'), ' end_time' = CONVERT_TZ (concat ('end_date', '',' end_time'), '+02: 00' , '+00: 00'); – Matish