1292错误:列“updated_at”的日期时间值不正确

4

我在Laravel中创建了一个包含标准datetime列的表:

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点也没有任何特殊之处。 - Tim Biegeleisen
我很愿意相信这一点。我从未在我的生活中见过这种情况,但我可以观察到它的发生。我甚至可以录制一个屏幕共享运行SQL原始代码来进行演示。 - eComEvo
1
有一个猜测:在你们国家,今天开始实行夏令时了吗?时钟会从凌晨1:59调整到3:00吗?这可能可以解释错误的原因,因为在那一天,凌晨2点根本不存在。 - CherryDT
@CherryDT 这是我能够解释这个问题的唯一方式,而不必假设我在《落日余晖区》的一集中。夏令时(也毫无意义地)已经到来。 - eComEvo
2
这是使用DATETIME的一个令人讨厌的后果,因为它使用本地时区。(出于这个原因,我更喜欢TIMESTAMP。)另外,考虑DST结束时会发生什么-有两个2:00,但在SQL中你无法区分2A:00和2B:00,所以要准备好! - CherryDT
1个回答

7

看起来您在美国,处于一个刚刚开始实行夏令时的时区。

因此,今天早上2点是不存在的

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

当当地标准时间即将到达
2020年3月8日星期日02:00:00的时候,时钟向前调整1小时,变为
当地夏令时的2020年3月8日星期日03:00:00。

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

MySQL中的DATETIME使用本地时间(时区可以通过多种方式设置),在您的情况下可能是您的本地时间,这就是为什么会遇到这个问题。如果您实际上是指UTC时间,您需要先将时区设置为UTC,方法是使用SET time_zone = "+00:00"或设置正确的全局配置

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接