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

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

Скажем, у вас есть данные с меткой времени (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`)
)

Тогда, когда I

"select value, date from SomeDateTable";

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

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

"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 отсутствует эта функция, используйте с осторожностью.

Ответ 2

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

CONVERT_TZ(date,'+00:00','-07:00')

Ответ 3

select convert_tz(now(),@@session.time_zone,'+03:00')

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

time(convert_tz(now(),@@session.time_zone,'+03:00'))

Ответ 4

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

SET time_zone = 'proper timezone';

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

Ответ 5

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