1292 Неверное значение даты и времени для столбца updated_at - PullRequest
4 голосов
/ 08 марта 2020

Я создал таблицу в Laravel со стандартными столбцами даты и времени:

Schema::create('lists', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('ref');
    $table->string('provider');
    $table->timestamps();
    $table->softDeletes();

    $table->unique(['provider', 'ref']);
});

Когда я пытаюсь создать простую запись с помощью Eloquent:

List::updateOrCreate([
    'provider' => 'test',
    'ref'      => 'S4d3g'
], [
    'name' => 'Plan'
]);

Я с учетом этого сообщения (которое является необработанным выводом консоли, поэтому игнорируйте отсутствие кавычек):

SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2020-03-08 02:25:07' for column 'updated_at' at row 1 (SQL: insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values (test, S4d3g, Plan, 2020-03-08 02:25:07, 2020-03-08 02:25:07))

Выполнение запроса к базе данных вручную, так как raw SQL также не работает:

insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 02:25:07', '2020-03-08 02:25:07')

Я использую MySQL 5.7.

Необъяснимым образом, если я изменяю дату на что-то, кроме 2 утра, это работает:

insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 01:25:07', '2020-03-08 01:25:07')
insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 03:25:07', '2020-03-08 03:25:07')

Что может быть причиной эта странная MySQL нелюбовь к уровню 2:00 на отметке времени?

1 Ответ

3 голосов
/ 08 марта 2020

Похоже, что вы находитесь в США, в часовом поясе, где летнее время только началось .

Следовательно, 2:00 не существует сегодня.

8 марта 2020 г. - начинается переход на летнее время

Когда местное стандартное время приближается к
В воскресенье, 8 марта 2020 г., 02:00:00 часы переведены на 1 час вперед вместо
Воскресенье, 8 марта 2020 г., 03:00:00 по местному летнему времени.

Восход и заход солнца будут примерно на 1 час позже 8 марта 2020 г., чем днем ​​ранее. Вечером будет больше света.

DATETIME в MySQL использует местное время (часовой пояс можно установить множеством способов), и в вашем случае это, вероятно, ваше местное время, поэтому вы столкнулись с этой проблемой. Если вы на самом деле имели в виду UT C, вам придется сначала установить часовой пояс UT C, используя SET time_zone = "+00:00" или указав правильную глобальную конфигурацию .

Поскольку ваша библиотека PHP генерирует это (недопустимое) время, я предполагаю, что у вас есть несоответствие между часовыми поясами, используемыми PHP и MySQL.

...