2014-09-20 6 views
2

В моей таблице MySql есть столбец с именем _time типа varchar. Значения его трюмы в формате: year month day hour minute без пробелов: 201409201945 Я хочу, чтобы преобразовать его в datetime так, что я делаю это:Невозможно преобразовать varchar в datetime в MySql

ALTER TABLE `my_table` CHANGE COLUMN `_time` `date_time` DATETIME NOT NULL; 

И он бросает эту ошибку по некоторым причинам:

Error Code: 1292. Incorrect datetime value: '201409201945' for column '_date_time' at row 1 0.036 sec

+2

Я бы добавил новый столбец с правильным типом, запустил обновление, чтобы выполнить соответствующее преобразование данных, а затем отбросить старый столбец –

+0

@Arkain, соответствует ли дата даты? –

+0

@Arkain, как пользователь будет обновлять данные с использованием существующих данных. (Данные старого формата) –

ответ

6

три шага @Arkain упомянул бы с помощью функции STR_TO_DATE

-- add the new column 
ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME; 

-- update the new column with the help of the function STR_TO_DATE 
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i'); 

-- drop the old column 
ALTER TABLE `my_table` DROP COLUMN `_time`; 

Полный список спецификаторов для STR_TO_DATE можно найти на DATE_FORMAT, здесь отрывок с теми, я использовал:

%d Day of the month, numeric (00..31) 
%H Hour (00..23) 
%i Minutes, numeric (00..59) 
%m Month, numeric (00..12) 
%Y Year, numeric, four digits 

Demo of the UPDATE

Если новый столбец Shoul d имеют атрибут NOT Нолл, один способ может быть, чтобы установить режим SQL перед операцией, чтобы «» и сбросить sql_mode позже:

SET @old_mode = @@sql_mode; 
SET @@sql_mode = '';  -- permits zero values in DATETIME columns 

ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME NOT NULL; 
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i'); 
ALTER TABLE `my_table` DROP COLUMN `_time`; 

SET @@sql_mode = @old_mode; 

Updated Demo

+0

@GordonLinoff Очень верно, исправлена ​​ошибка без ошибок и вставки. – VMai

+0

@GordonLinoff Я просто попробовал, и у меня не было ошибок. Значение нового столбца для существующих строк по умолчанию равно «0000-00-00 00:00:00» – abl

+0

, вы уверены, что оно «i» в «% Y% m% d% H% i»? –

0

Поскольку база данных не знает, что делать с 201409201945, это не действительный формат DateTime, поэтому он не может изменить его

Вы можете удалить данные т Шляпа в ней уже, а затем попытаться изменить его

+0

это не ответ. комментарий ниже вопроса –

+0

Удаление данных не является целью OP, я уверен. – VMai

+0

Тогда напишите мир кода, чтобы преобразовать его, он должен был указать это. –

1

Если данные varchar были отформатированы, как это " 2014-09-20 19:45 'будет изменен тип данных вашей колонки. Зачем? это представление символов, используемое DATETIME и другими ориентированными на время типами данных.

Но это не так. Итак, какой у вас выбор? Один использовать эти четыре шага:

  1. изменить таблицу, чтобы добавить новый DATETIME столбец с временным именем
  2. сделать UPDATE, не WHERE пункта, чтобы заполнить значения этого столбца
  3. альтер таблица для удаления предыдущего столбца
  4. измените таблицу, чтобы переименовать новый столбец, чтобы иметь то же имя, что и столбец, который вы только что сбросили.

Вот как это будет происходить.

ALTER TABLE my_table ADD COLUMN tempstamp DATETIME 
UPDATE my_table SET tempstamp = STR_TO_DATE(_time, '%Y%m%d%H%i') 
ALTER TABLE my_table DROP COLUMN _time 
ALTER TABLE my_table CHANGE tempstamp _time DATETIME NOT NULL 

Другой подход: Изменение строки в ваших _time до допустимых значений даты и времени, а затем изменить вашу колонку. Если ваши varchars() достаточно широкие, чтобы удерживать несколько дополнительных символов, попробуйте это.

UPDATE my_table SET `_time`=STR_TO_DATE(`_time`, '%Y%m%d%H%i') 
ALTER TABLE my_table CHANGE `_time` `_time` DATETIME NOT NULL 

Это работает, потому что STR_TO_DATE() делает DATETIME значения ваших строк, а затем MySQL отбрасывает их обратно в строки для хранения обратно в varchar колонку. Затем вы можете изменить тип данных на DATETIME.

Возможно, вы заметили, что я бросил NOT NULL. Если вы поместите индекс в этот столбец, то NOT NULL - хорошая вещь. Но если некоторые из ваших значений времени отсутствуют, это не сработает.

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