Может ли MySQL преобразовать сохраненное время UTC в местный часовой пояс? - PullRequest
45 голосов
/ 02 февраля 2010

Может ли MySQL преобразовать сохраненное время UTC в местное время: редактировать время непосредственно в обычном операторе выбора?

Допустим, у вас есть некоторые данные с отметкой времени (UTC).

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

Тогда, когда я

"select value, date from SomeDateTable";

Я, конечно, получаю все даты как в сохраненной форме UTC.

Но скажем, я бы хотел, чтобы они были в другом часовом поясе (с летним временем), затем я могу добавить магию в запрос на выборку, чтобы получить все даты в выбранном часовом поясе?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";

Или я должен сделать это в каком-то другом слое сверху, как в каком-то php-коде? (похоже, что большинство людей решили эту проблему).

Спасибо Johan


Если ваша установка MySQL позволяет вам использовать CONVERT_TZ, это очень чистое решение, этот пример показывает, как его использовать.

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

Однако я не знаю, является ли это хорошим способом, поскольку в некоторых установках MySQL отсутствует эта функция, используйте с осторожностью.

Ответы [ 5 ]

31 голосов
/ 02 февраля 2010
24 голосов
/ 24 августа 2013

Для тех, кто не может настроить среду mysql (например, из-за отсутствия доступа SUPER) для использования удобных для человека названий часовых поясов, таких как «Америка / Денвер» или «GMT», вы также можете использовать функцию с числовыми смещениями, например так:

CONVERT_TZ(date,'+00:00','-07:00')
8 голосов
/ 11 июля 2016
select convert_tz(now(),@@session.time_zone,'+03:00')

Для получения времени используйте только:

time(convert_tz(now(),@@session.time_zone,'+03:00'))
3 голосов
/ 15 февраля 2010

Я предлагаю использовать

SET time_zone = 'proper timezone';

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

0 голосов
/ 03 февраля 2010

Я не уверен, что математика может быть сделана для типа данных DATETIME, но если вы используете PHP, я настоятельно рекомендую использовать целочисленные временные метки.По сути, вы можете хранить 4-байтовое целое число в базе данных, используя PHP-функцию time ().Это делает математику гораздо проще.

...