MySQL не понимает даты в формате ДД / ММ / ГГГГ. Если вы сделаете показанный оператор ALTER TABLE, он не сможет преобразовать эти даты в значение типа DATE.
Вам необходимо преобразовать строки в формат YYYY-MM-DD.
I рекомендуем начать с нового столбца:
ALTER TABLE date_checks ADD COLUMN Start_Date2 DATE;
Затем скопируйте значения в новый столбец.
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d/%m/%Y');
Если строка типа «3 года» не в формате которая соответствует строке формата в этой функции, затем STR_TO_DATE () возвращает NULL.
Так что после этого ОБНОВЛЕНИЯ вы скопируете большинство ваших дат в надлежащий формат, но те, которые не могут быть проанализированы, будут равны NULL. .
Затем вы можете проверить наличие странных случаев, которые не удалось проанализировать. Их может быть достаточно, чтобы вы могли обновить их в новом столбце вручную.
SELECT Start_Date FROM date_checks WHERE Start_Date2 IS NULL;
После того, как вы вручную присвоили все, что хотите сохранить, оставшиеся строки Start_Date хранить не стоит. Затем вы можете свободно удалить старый столбец и переименовать новый.
ALTER TABLE date_checks DROP COLUMN Start_Date,
CHANGE COLUMN Start_Date2 Start_Date DATE;
Повторный комментарий:
Как изменить код обновления на принять оба?
Я не знаю, что это необходимо сделать за один проход. Вы можете сделать это за несколько проходов:
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d/%m/%Y');
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d-%m-%Y') WHERE Start_Date2 IS NULL;
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d.%m.%Y') WHERE Start_Date2 IS NULL;
...other formats...
Таким образом, после каждого прохода меньшее количество строк будет иметь значение NULL для Start_Date2. Вы продолжаете пробовать другие форматы по мере необходимости, пока либо не останется NULL, либо вы не захотите сдаться, потому что последние несколько отставших не разбираются.
Как и то, что вы делаете, если остался один, но строка в Start_Date
гласит: «Старее моего языка и немного старше моих зубов»?
Если вы действительно если это нужно сделать за один проход, вы можете использовать COALESCE () с несколькими попытками:
UPDATE date_checks SET Start_Date2 = COALESCE(
STR_TO_DATE(Start_Date, '%d/%m/%Y'),
STR_TO_DATE(Start_Date, '%d-%m-%Y'),
STR_TO_DATE(Start_Date, '%d.%m.%Y')
...other formats...
);
COALESCE () возвращает свой первый ненулевой аргумент. Поэтому он будет пробовать каждый из этих вызовов STR_TO_DATE () по порядку, слева направо, и результат будет первым, который завершится успешно. Или же NULL, если ни один из них не удался.