Перейти к содержимому

Конвертация времени «unix»

Как конвертировать время «UNIX» в стандартный вид (ещё говорят «человекопонятный») знают лишь избранные, которых по эту сторону Стикса называют программистами. Автор не является программистом, но жизнь поставила передо мной проблему дат в полный рост: я решил, во что бы то ни стало, спасти древнюю базу данных своего личного сайта и переформатировать её так, чтобы передать под управление ПО «ВордПресс».

Причём, сложности задаче добавило наличие в базе публикаций разного типа — статей, новостей, гостевой книги и даже форума, с несколькими тысячами сообщений. Всё это богатство, написанное с 2003 года и по сегодняшний день, будет размещено в одной таблице базы данных MySQL, так, как и положено при использовании ВП. Но, процесс только начинается и подробное описание перехода впереди. А сейчас вернёмся ко времени.

Что такое время «UNIX» и чем оно отличается от привычного нам, можно прочесть в сети, на русском языке, в доступном изложении. Пересказывать здесь неуместно, если не ставить задачу всех читателей усыпить. Примем по умолчанию, что вы, как и я, всё прочли, всё перерыли и затупились на том, что вместо реальных даты и времени получаете нули. И понимаем, что проблема в командах...

Команда конвертации

Итак, какой командой в PHPmyAdmin (на удаленном сервере или на своём локальном Денвере) можно преобразовать множество дат типа «unix время» в множество дат типа «datetime» стандартного формата YYYY-MM-DD HH:MM:SS?

Автор представленного исследования зарегистрировался в полусотне форумов (все они мёртвые, кстати, или близко к тому), прочёл библию MySQL, изучил тонкости обращения с PHPmyAdmin и написал сотню писем программистам. Через пять суток, в руках оказалось страшное оружие:

ALTER TABLE `my_table` MODIFY `my_column` datetime NOT NULL;
// перевод типа столбца `my_column` из `int` в datetime NOT NULL
ALTER TABLE `my_table` UPDATE `my_column` SET `datetime`=('time_unix');
// перевод unixtime в datetime

Не спешите из него стрелять, у него дуло кривое и снаряды из соломы. Команды делают (точнее, должны делать) преобразование в два этапа. В результате столбец модифицируется. Это уже неплохо. Но, вместо реальных дат и времени, он заполняется нулевыми значениями.

Конвертация времени unix

Не беда — подумал я и тут началось.

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET `datetime`=('from_unixtime(timestamp)');
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET `datetime`=('from_unixtime');
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET `datetime`=`from_unixtime`;
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET `datetime`=from_unixtime(timestamp);
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET from_unixtime(timestamp);
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET `from_unixtime(timestamp)`;
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET FROM_UNIXTIME(UNIX_TIMESTAMP(), 'YYYY-MM-DD HH:MM:SS');
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), 'YYYY-MM-DD HH:MM:SS');
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SELECT FROM_UNIXTIME(UNIX_TIMESTAMP);
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SELECT from_unixtime;
// перевод unixtime в datetime, не работает

ALTER TABLE `my_table` MODIFY `old_column` datetime NOT NULL;
ALTER TABLE `my_table` UPDATE `old_column` SET from_unixtime;
// перевод unixtime в datetime, не работает

Пять суток! Пять бесконечных бессонных суток!

Конечно, сказалось полное незнание основ и базовых правил в области PHP и MySQL. Сложность состояла и в том, что я не знаю синтаксиса MySQL. Возможно, неверно или не там использованы верхние одинарные кавычки (перевернутый апостроф). Я и сейчас не понимаю, как ими правильно пользоваться.

Однако, не боги горшки обжигают и на седьмые сутки сражения результат всё же получен. Держите, рабочий вариант перевода данных «unixtime» столбца «old_column», в данные «datetime» столбца «new_column».

update my_table set `new_column` = from_unixtime(`old_column`);

Важное уточнение!

Конвертация времени «unix» проводилась с помощью PHPmyAdmin на сервере MySQL. Преобразование нескольких тысяч ячеек с данными потребовало нескольких секунд. По этому же примеру можно выполнить и обратное преобразование. Теперь термин «unixtime» звучит для меня, словно музыка Айвазовского! Или как песни Сваровского!

Отличный результат. Ура!

Ура