【问题标题】:1292 Incorrect datetime value for column 'updated_at'1292 列“updated_at”的日期时间值不正确
【发布时间】:2020-03-08 02:33:34
【问题描述】:

我在 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))

在数据库上手动运行查询作为原始 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 点?

【问题讨论】:

  • 这不是一个可重现的问题,对于 MySQL 来说,凌晨 2 点并没有什么特别之处。
  • 我愿意相信这一点。我一生中从未见过这种情况发生,但我可以看到它发生。我什至可以录制一个运行 SQL raw 的屏幕共享来演示。
  • 只是一个预感:在你的国家,夏令时可能从今天开始,时钟从凌晨 1:59 到凌晨 3:00?这可以解释错误,因为那天凌晨 2 点根本不存在
  • @CherryDT 这是我可以解释的唯一方法,而不是假设我在暮光区的一集中。夏令时(也是荒谬的)在我们身上。
  • 这是使用使用本地时区的DATETIME 的恼人后果。 (出于这个原因,我更喜欢 TIMESTAMP。)另外,想想 DST 结束时会发生什么 - 有 两个 2am-s,但在 SQL 中你无法区分 2A:00 和 2B:00,做好准备吧!

标签: mysql laravel laravel-6.2


【解决方案1】:

您似乎在美国,在daylight saving time just started 所在的时区。

因此,今天凌晨 2 点不存在

2020 年 3 月 8 日 - 夏令时开始

当地标准时间即将到来时
2020 年 3 月 8 日,星期日,02:00:00 时钟拨快 1 小时至
改为 2020 年 3 月 8 日星期日 03:00:00 当地时间。

2020 年 3 月 8 日的日出和日落将比前一天晚约 1 小时。 晚上会有更多的光线。

DATETIME 在 MySQL 中使用本地时间(时区可以通过多种方式设置),在您的情况下,它可能是 您的本地时间,这就是您遇到此问题的原因。如果您实际上是指 UTC,则必须首先使用 SET time_zone = "+00:00" 或通过设置正确的 global configuration 将时区设置为 UTC。

由于您的 PHP 库正在生成这个(无效)时间,我假设您在 PHP 和 MySQL 使用的时区之间存在不匹配。

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 2020-01-19
    • 2017-07-18
    • 2017-11-08
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多