Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Сниппеты » PHP Сниппеты » Как изменить поле, изменения прямо в самой БД без PHP

Как изменить поле, изменения прямо в самой БД без PHP


     19.06.2014    date, дата, MySQL, запрос в бд    PHP Сниппеты    3945

Всем доброго времени...
Столкнулся с задачкой... У меня в таблица четыре поля типа TEXT где хронятся (премьера_мир, премьера_рф, релиз_двд, релиз_блю_рей)

и записи в данных полях такого типа 12 января 2003, 4 октября 2001 и т.д.

так вот задумал я изменить тип полей с TEXT на DATE

Но!!! Как же при этом сохранить все записи в данных полях... и не делать всё рутину по написанию PHP цикла с запросами к БД и прочей лабудой, тем более в таблице чуть больше чем 98,000 записей. =)

Делюсь с вами кучкой запросов в phpmyadmin

К примеру есть таблица dle_post поле premiere запись 12 января 2003
1) изменяем текстовой месяц на цифровой
UPDATE `dle_post` SET `premiere` = REPLACE(`premiere`,' января ','-01-');
массово ищет и заменяет совпадение января на -01-

2) теперь мы имеем запись 12-01-2003 == ДД-ММ-ГГГГ ... но нам всё равно это не подходит так в таблице дата хранится в формате ГГГГ-ММ-ДД
UPDATE dle_post SET premiere = CONCAT( SUBSTRING( premiere, -7, 7), '-12') WHERE premiere LIKE '12-__-____';
массово ищет текст где будет 12-__-____ ( "_" только число) патом CONCAT( SUBSTRING( premiere, -7, 7), '-12') (вырезаем часть записи из данной таблицы и получаем 01-2003 и дописываем с конца -12)
то есть мы искали совпадения по числу дня, патом вырезали число месяц и год (без дня) дописывали сзади день и сразу же возвращали запись в бд


3) теперь мы имеем запись 01-2003-12 == ММ-ГГГГ-ДД ... но нам всё равно это не подходит так в таблице дата хранится в формате ГГГГ-ММ-ДД
UPDATE dle_post SET premiere = CONCAT( SUBSTRING( premiere, 4, 4), '-01-', SUBSTRING( premiere, 9, 2) ) WHERE premiere LIKE '01-____-__';
где мы сделали почти тоже самое что и в пункте 2 только искали уже по месяцу (который у нас в начале записи) и вырезаем уже отдельно год и отдельно день между ними вставлял месяц и возвращали запись в бд

4) теперь мы имеем запись 2003-01-12 == ГГГГ-ММ-ДД ... теперь нам это подходит так в таблице дата хранится в формате ГГГГ-ММ-ДД
ALTER TABLE  `dle_post` CHANGE  `premiere`  `premiere` DATE NOT NULL DEFAULT  '0000-00-00';
делаем запрос на изменение типа даты

готово ..
Надеюсь кому то пригодится ))
С уважением Ваш Сергей Геннадьевич (D0Gmatist)

9 комментариев

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 20:51 -

Тебе надо почитать про date_format и unixtimestamp

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

D0Gmatist
Юзер

D0Gmatist - 30 июня 2014 20:57 -

А чем бы мне это помогло изменить тип поля с
[TEXT] с данными 12 января 2003 (ДД.Месяц.ГГГГ)

на
[DATE] с данными 2003-01-12 (ГГГГ-ММ-ДД)

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 21:15 -

Я еще не совсем старый)))

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE('2003-01-12','%Y-%m-%d'))),'%Y-%m-%d');

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 21:17 -

Грешок, у тебя год в конце

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE('12-01-2003','%d-%m-%Y'))),'%Y-%m-%d');

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 21:22 -

Вот так, если месяц названием ( щас вспомню как сделать на русскую локаль )

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE('12-january-2003','%d-%M-%Y'))),'%Y-%m-%d');

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 21:29 -

Все таки не выйдет сделать одним запросом на русские форматы, в документации сказано:

lc_time_names does not affect the STR_TO_DATE() or GET_FORMAT() function.


Так что
SET @@lc_time_names = ru_RU;
не поможет(

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

D0Gmatist
Юзер

D0Gmatist - 30 июня 2014 21:35 -

Хе хе хе )))

dj-avtosh
PHP-developer

dj-avtosh - 30 июня 2014 22:23 -

Осилил:

SET @my_date = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('13-февраля-2003',
'января', '01'),
'февраля', '02'),
'марта', '03'),
'апреля', '04'),
'мая', '05'),
'июня', '06'),
'июля', '07'),
'августа', '08'),
'сентября', '09'),
'октября', '10'),
'ноября', '11'),
'декабря', '12');


SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE(@my_date,'%d-%m-%Y'))),'%Y-%m-%d');

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

D0Gmatist
Юзер

D0Gmatist - 30 июня 2014 23:15 -

dj-avtosh, ааа ... во ты психанул )))

Чтобы комментировать - войдите или зарегистрируйтесь на сайте
наверх