#Как проявляется проблема и где искать причину
Сообщение Incorrect datetime value появляется, когда MySQL не может принять дату в заданном формате или значение не соответствует типу столбца и действующему sql_mode. Строгий режим может отклонять значения, которые ранее приводились неявно.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный форматПриложение передаёт дату в пользовательском формате | В запросе есть 02.11.2026 вместо SQL-формата | Привести к YYYY-MM-DD HH:MM:SS |
| Недопустимое значениеЧасы, месяц, день или нулевая дата вне правил | Ошибка на одном конкретном поле | Проверять входные данные до INSERT |
#Пошаговая диагностика и устранение
- 1. Зафиксируйте исходный параметрПо журналу приложения найдите параметр даты и имя столбца, не записывайте секреты/личные сведения. Отделите ошибку одного INSERT от ошибки при чтении.
- 2. Посмотрите тип столбцаВ mysql-клиенте под учётной записью чтения выполните описание проблемной таблицы и найдите тип DATETIME, TIMESTAMP или DATE. Не путайте строку с датой.
- Замените appdb.events; команда не меняет данныеSQLКомандаЗамените appdb.events; команда не меняет данные.
SHOW COLUMNS FROM appdb.events;
- 3. Проверьте текущий строгий режимЗапрос покажет sql_mode сессии. Важны STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_DATE и другие режимы в зависимости от версии сервера.
- В mysql-клиенте; только чтение текущей сессииSQLКомандаВ mysql-клиенте; только чтение текущей сессии.
SELECT @@SESSION.sql_mode;
- 4. Сравните значение с SQL-форматомДля DATETIME используйте YYYY-MM-DD HH:MM:SS: например, 2026-11-02 15:40:00. Убедитесь, что время суток 00–23, минуты/секунды 00–59, число действительно существует в месяце.
- 5. Проверьте преобразование без записиНа тестовом соединении проверьте корректную строку через STR_TO_DATE, учитывая предупреждения сервера. Функция не записывает данные и показывает, как сервер интерпретирует строку.
- SQL-клиент; пример для корректной датыSQLКомандаSQL-клиент; пример для корректной даты.
SELECT STR_TO_DATE('2026-11-02 15:40:00', '%Y-%m-%d %H:%i:%s');
- 6. Измените обработку в приложенииВ коде валидируйте дату до SQL, формируйте значение для нужного типа и передавайте его параметром подготовленного запроса. Если приходит строка с часовым поясом, явно преобразуйте её к принятому стандарту; для TIMESTAMP учтите временную зону сессии.
- 7. Проверьте редкие случаи на копииПротестируйте переход через полночь, февраль в високосный год, конец месяца, пустую строку и NULL. Для NULL проверьте, допускает ли его столбец. Неверные значения должны отклоняться приложением с понятным сообщением.
- 8. Контроль записи и чтенияСделайте одну пробную запись в отдельную тестовую таблицу и прочитайте значение обратно. Если разница только по времени, исследуйте timezone; если ошибка осталась, сопоставьте фактический параметр и SQL-тип.
#Как проверить результат
В тестовой базе корректные даты записываются и читаются без изменения, неверные данные отклоняются до SQL, строгий режим сохранён.
#Если исправление не помогло
При миграции со старой версии нельзя механически заменять нулевые даты текущей датой — сначала согласуйте бизнес-смысл неизвестной даты.