2010-03-26 3 views
32

Привет всем (от новичка MySQL)MySQL CONVERT_TZ()

Я пытаюсь создать базу данных, которая хранит ежедневно раз Уведомления, как указано пользователем. Например, пользователь хочет получить предупреждение, если какой-либо критерий выполняется каждый день с 7:00 до 7:30. В попытке реализовать это, мне нужно разместить летнее время. Вот моя попытка решения:

  1. Храните пользователи локального часового пояса (в длинной форме, например, «US/Eastern») информация в одной таблице (скажем USERINFO), и время срабатывания сигнализации в другой таблице (говорят userAlarms).
  2. При запросе таблицы userAlarms преобразуйте время UTC в локальное время пользователя, как указано столбцом tz, хранящимся в таблице userInfo, с помощью CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz).

Вопрос 1. Из моего понимания, указав название часового пояса (например, US/Eastern) должны принять летнее время во внимание дневного света. Например, при вызове CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN') 1 января должно быть указано «19: 00: 00», но 1 июля вызов должен дать «20: 00: 00». Я прав?

Вопрос 2. Если Q1 правильный, мне нужно постоянно обновлять таблицу часовых поясов MySQL, чтобы обновлять временные интервалы UTC?

Вопрос 3. Образец, указанный в документации MySQL SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'), дает «NULL» при запуске на моем сервере. Может ли это быть вызвано отсутствием настройки таблиц часовых поясов? Как я могу это проверить?

ответ

17

Q1: Да, CONVERT_TZ учитывает время летнего времени. Эта информация и время начала и окончания DST для каждого часового пояса сохраняются в таблицах time_zone_ *.

Q2: Да, как указано в документах mysql, информация о часовом поясе изменяется в зависимости от политики каждой области. Вам нужно обновлять таблицы time_zone_ * каждый раз, когда происходит изменение. Иногда это отстой, это один из них.

Q3: Это 5 таблицы часовых поясов, запросить их, чтобы увидеть, если у них есть что-нибудь в них:

select * from mysql.time_zone_transition_type; 
select * from mysql.time_zone_transition; 
select * from mysql.time_zone_name; 
select * from mysql.time_zone_leap_second; 
select * from mysql.time_zone; 
+1

Это мне дает «Ошибка 1046 (3d000): Нет базы данных выбрано» –

+1

Вам нужно для вывода вывода в буквальном смысле mysql -uroot mysql' - mysql, являющегося двоичным исполняемым файлом, а второй mysql - именем базы данных. – philwinkle

+0

или использовать mysql; 'сначала использовать этот db для всех команд. Или непосредственно: 'SELECT * FROM mysql.time_zone;' – Razor

20

Я нашел эту нить полезным, и решил поделиться страницу DOC для импорта этой информации. Я сделал точно так, как указано ниже в CentOS и RHEL, и это работало безупречно. Теперь я могу использовать функцию CONVERT_TZ с такими аргументами, как «GMT» и «US/Eastern».

Из документации MySQL это как импортировать информацию о времени таблицы зоны MySQL:

http://dev.mysql.com/tech-resources/articles/4.1/time.html


Для всех пользователей, работающих с MySQL 4.1.3 или более поздней версии на системе Unix основе (напомним, это еще не работает в системах Windows):

Заполнение таблиц часового пояса.

Для этого запустите программу mysql_tzinfo_to_sql, снабженную распределением MySQL. mysql_tzinfo_to_sql считывает файлы часовых поясов операционной системы и генерирует из них SQL-запросы. Операторы SQL затем обрабатываются mysql для загрузки таблиц часовых поясов.

Чтобы успешно запустить mysql_tzinfo_to_sql, необходимо знать, где хранятся файлы часовых поясов операционной системы сервера; проверьте каталог с именем, похожим на /usr/share/zoneinfo. Передайте имя каталога в командной строке до mysql_tzinfo_to_sql и отправьте вывод в программу mysql. Вот пример.

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

Примечание: Эта команда предполагает, что «mysql_tzinfo_to_sql» и «MySQL» в вашем пути. Если это не так, вам нужно указать полный путь к как при выполнении команды или перейти в папку MySQL бен и использовать команду следующим образом:

shell> ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql 
+0

Мне также нужно было перезапустить демон MySQL, прежде чем он вступит в силу (на Debian). – Ekster

24

Если это дает нуль, то TZ таблицы не были созданы:

SELECT CONVERT_TZ(now(),'US/Eastern','US/Central'); 

Если у вас нет таблицы часовых поясов настройки можно обновить час смещение в таблице пользователей, а затем сделать:

select utc_timezone() - interval user_timezone_offset_in_hours hour 
from userinfo a 
where user_id = 999; 

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

Если вы пишете это для веб-приложения, вы можете получить часовой пояс через javascript, вот article, который описывает, как (не пробовал, но похоже, что он будет работать).

Немного объяснений относительно «интервала» выше ...

Один из более трюковых конструкций в MySQL является использованием INTERVAL ключевого слова, лучше всего показан на примере (числовое значение может быть выражение или значение поля)

select now() today, now() - interval 1 day yesterday; 
+---------------------+---------------------+ 
| today    | yesterday   | 
+---------------------+---------------------+ 
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 | 
+---------------------+---------------------+ 

вы можете добавить их и вычитать их в любом случае вам нравится, поэтому я не никогда заморачиваться с указанием даты/времени добавления/вычитания/преобразования функции

select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b; 
+---------------------+---------------------+ 
| a     | b     | 
+---------------------+---------------------+ 
| 2011-05-26 13:24:16 | 2011-05-25 17:32:16 | 
+---------------------+---------------------+ 

Вы можете использовать отрицательные числа (должно быть хорошо для отрицательных смещений часовых поясов) это не то же самое:

select now() - interval 1 month a, now() + interval -1 month b; 
+---------------------+---------------------+ 
| a     | b     | 
+---------------------+---------------------+ 
| 2011-04-26 13:38:05 | 2011-04-26 13:38:05 | 
+---------------------+---------------------+ 
+0

Спасибо большое! это очень полезно ~ – Scarlett

+0

хороший ответ! интервал + convert_tz скалы! –

+0

Что такое 'user_timezone_offset_in_hours'? –

Смежные вопросы