Вопрос:

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

mysql sql timezone convert-tz

92515 просмотра

6 ответа

10849 Репутация автора

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

Допустим, у вас есть некоторые данные с отметкой времени (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.

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

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

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

Спасибо Йохан


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

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

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

Автор: Johan Источник Размещён: 02.02.2010 08:51

Ответы (6)


33 плюса

1732 Репутация автора

Решение

Да, функция convert_tz.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

Автор: Stephen Fischer Размещён: 02.02.2010 08:58

0 плюса

6622 Репутация автора

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

Автор: TheBuzzSaw Размещён: 02.02.2010 09:00

1 плюс

200173 Репутация автора

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

SET time_zone = 'proper timezone';

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

Автор: zerkms Размещён: 14.02.2010 09:56

26 плюса

1845 Репутация автора

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

CONVERT_TZ(date,'+00:00','-07:00')
Автор: tmsimont Размещён: 23.08.2013 11:48

9 плюса

423 Репутация автора

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

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

time(convert_tz(now(),@@session.time_zone,'+03:00'))
Автор: Jestin Размещён: 11.07.2016 08:32

0 плюса

304 Репутация автора

Можно легко использовать

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')

Например:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')

Кроме того, это также можно использовать в операторе WHERE и для сравнения метки времени я бы использовал следующее в предложении Where:

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}
Автор: MR_AMDEV Размещён: 31.07.2019 07:25
Вопросы из категории :
32x32