2013-08-07 3 views
5

Мне нужно преобразовать некоторые поля TIMESTAMP в INT в нашей базе данных MySQL (InnoDB). Я понимаю, что преобразование TIMESTAMP в INT необычно, но нам все равно нужно это делать :)Mysql преобразование TIMESTAMP в INTEGER - timezones

Это кажется достаточно прямым, но есть некоторые ошибки в часовом поясе и летнее время.

У меня есть сценарий, который генерирует мой SQL-код за столбец. Например, он генерирует:

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

Если сравнивать до и после того, как данные с помощью select FROM_UNIXTIME(1291788036);, результат выглядит хорошо.

Идея состоит в том, чтобы изменить все клиентское программное обеспечение для преобразования в UTC и использовать этот INT при его хранении. При извлечении этот INT преобразуется в текущий часовой пояс.

Но тогда Docs warn me об этом сценарии (декретное в КЭТ):

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

Как API и ОС обычно имеют дело с экономией дневного света? Я знаю, что мой компьютер имеет часы в UTC, а в летнее время ОС добавляет ему два часа, а зимой - один. Я предполагаю, что он использует время UTC, чтобы определить, является ли это DST или нет.

Итак, как мне с этим справиться? Является единственным решением для добавления поля в базу данных для задания смещения DST?

+1

Летнее время - это другой часовой пояс. Например. CET - центральноевропейское время, CEST - центральноевропейское летнее время. Ваша ОС знает, когда нужно переключаться. До тех пор, пока вы используете UTC для временных меток, до уровня представления нужно преобразовать его в локальное время. –

ответ

3

Вам не нужно хранить время в INT. Тип MySQL TIMESTAMP так или иначе (он использует стандартные временные метки unix для хранения времени), и они всегда находятся в UTC.

Вам нужно установить часовой пояс сеанса, и все столбцы TIMESTAMP будут преобразованы из/в вашу зону при их обновлении/выборе.

Вы можете установить зону на время подключения/инициализации раз:

SET time_zone = '+10:00'; 

И тогда вы можете выбрать/обновить время в вашей зоне непосредственно

SELECT timesamp_column FROM table ... 

Я не очень хорошо знаком с datetime, но я предполагаю, что они используют часовой пояс, который вы предоставили, и время, о котором идет речь, чтобы определить временные рамки и смещения дневного света.

В приведенном примере Я думаю, что одно из значений на самом деле недействительно, потому что часы должны прыгать с 01:59:59 до 03:00:00 и 02:00:00, на самом деле не произошло. Функция UNIX_TIMESTAMP, вероятно, вернет ближайшую секунду в этом случае.

+0

Я знаю, что могу использовать временные метки, но я не могу использовать этот тип. Клиентская сторона должна быть совместима с sqlite, следовательно, это преобразование в INT. И о недействительном времени; в конце дневного света вы будете выделять определенное время два раза в день, что будет иметь ту же проблему. – Halfgaar

+0

Есть несколько точек во времени с тем же строковым представлением, и есть пробелы. Я не думаю, что вы можете с этим поделать. Сохраните ваши значения как временные метки unix (INT) и преобразуйте их в локальное время с функциями MySQL или клиентской частью библиотеки времени. Пока вы правильно настроили часовой пояс, он должен отображаться правильно. – Vatev

+0

Я только что протестировал вставку '2005-03-27 02:00:00' в колонке TIMESTAMP. Получение его также дает вам «2005-03-27 03:00:00», поэтому, я думаю, все в порядке. – Halfgaar

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