#mysql
#mysql
Вопрос:
Я допустил ошибку в последнем обновлении своего кода,
В первый раз я прошу пользователей указать формат даты, например 1999-05-21
Затем во второй раз я изменил формат на 21-05-1999
Теперь проблема в том, что скрипт работает только для пользователей формата 1999-05-21 (ГГГГ-ММ-ДД), но есть много пользователей, которые зарегистрировались с неправильным именем, как исправить день рождения всех пользователей в базе данных MySQL
Есть ли способ изменить эту последовательность? На сервере или путем экспорта БД на локальном компьютере или любом программном обеспечении?
Комментарии:
1. Вы должны хранить дату как даты, а не строки.
2. @Shadow Я думаю, что старый разработчик хранит как строку, потому что он может поддерживать различные типы форматов, такие как 10-12-1999 и 10-Dec-1999 и 1999-12-10 из-за использования API
3. Вы, кажется, говорите, что вообще нет правил для принятия даты, если это так, то простого способа сделать это нет, вам нужно протестировать все известные варианты и вручную изменить странности.
Ответ №1:
Вы можете проанализировать их как даты с помощью STR_TO_DATE(str,format)
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_str-to-date
Например.
> SELECT (STR_TO_DATE("21-05-1999", "%d-%m-%Y"))
"1999-05-21"
Это должно позволить вам обновить все строки, которые анализируются на сегодняшний день, с помощью этого формата для исправления дат
UPDATE birthdays SET birthday = STR_TO_DATE(birthday, "%d-%m-%Y")
WHERE STR_TO_DATE(birthday, "%d-%m-%Y") IS NOT NULL;
Комментарии:
1. Я использовал эту команду
UPDATE users SET birthday = STR_TO_DATE(birthday, "%Y-%m-%d") WHERE STR_TO_DATE(birthday, "%d-%m-%Y") IS NOT NULL;
, но она заменяет 26-05-1974 на 2026-05-19 есть идеи, почему?2. По какой-то причине вы изменили формат при установке нового дня рождения
"%Y-%m-%d"
. Это должно быть"%d-%m-%Y"
, потому что это формат, из которого вы анализируете.3. Это не поможет, если у вас уже есть смешанные записи в вашей базе данных
Ответ №2:
UPDATE users SET birthday = CONCAT(SUBSTR(birthday, 7, 4),'-',SUBSTR(birthday, 4, 2),'-',SUBSTR(birthday, 1,2) WHERE SUBSTR(birthday, 3,1) = '-'
и после этого вы должны изменить формат столбца на
ALTER TABLE user MODIFY COLUMN birthday DATE