无效的日期时间格式:1292 不正确的日期时间值 - Laravel 5.2

12
当我将这些值插入数据库表时,出现了以下错误:
SQLSTATE [22007]:无效的日期时间格式:列'registration_from'在第1行上的“24/06/2017”为不正确的日期时间值 (SQL:insert into'campus_registrations'(`campus_major_class_id`, `registration_from`,`registration_to`,`testing`,`announcement`, `enrollment_from`,`enrollment_to`,`updated_at`,`created_at`) values (3,24/06/2017,27/06/2017,13/07/2017,01/08/2017, 05/09/2017,31/01/2018,2017-06-07 09:39:31,2017-06-07 09:39:31))
我需要先初始化日期时间吗?

首先将您的表模式添加到问题中。 - kRicha
@kRicha 它们都是日期时间。 - goateee25
@goateee25 尝试使用这个格式 date("Y-m-d H:i:s") - kRicha
11个回答

31

在尝试从Vue.js前端向Laravel后端API注册用户时,我遇到了同样的错误。

解决方法是将MySQL的严格模式更新为false。如果有人知道这种方法的缺点,请留下评论!

//config/database.php
'mysql' => [
    'strict' => false,
]

4
缺点是,如果日期格式不符合 Y-m-d 格式,MySQL 会将提供的日期替换为 0000-00-00,而不是抛出错误。 - Qumber

15

错误在这里:

Incorrect datetime value: '24/06/2017' for column 'registration_from' at row 1

MySQL中date列的默认格式是Y-m-ddatetime列的默认格式是Y-m-d H:i:s。所以请将您的日期更改为此格式并重试。


15

由于您没有使用标准的日期时间格式,请为每个日期定义一个访问器。例如:

public function setRegistrationFromAttribute($value)
{
    $this->attributes['registration_from'] =  Carbon::parse($value);
}

13
不要忘记Y2K38问题(2038年问题)- 时间戳(timestamp)的限制是从UTC的1970年1月1日00:00:01到2038年1月19日03:14:07(来源),而日期时间(dateTime)的范围是从1000年1月1日00:00:00到9999年12月31日23:59:59,因此在确定要使用哪种类型之前,请考虑您计划存储在该字段中的内容。
时间戳(timestamp)和日期时间(dateTime)相似 - 它们将日期(YYYY-MM-DD)和时间(HH:MM:SS)一起存储在单个字段中,即YYYY-MM-DD HH:MM:SS。两者之间的区别在于,时间戳可以使用(MySQL的)CURRENT_TIMESTAMP作为其值,无论何时更新数据库记录都可以处理它。这可在数据库级别处理,并非常适合Laravel的created_at和updated_at字段。
日期只存储日期部分,即YYYY-MM-DD(1000-00-01至9999-12-31)。
timestamps不需要参数,它是向数据库添加created_at和updated_at时间戳字段的快捷方式。
因此,在时间戳上设置大于2038年1月19日03:14:07 UTC的日期也会抛出错误-SQLSTATE[22007]:无效的日期格式:1292日期时间值不正确。

1
有人知道Y2K38是否会更新到更大的范围吗?不过很好的发现!谢谢 - Mohammad Hossein
这个问题有解决方案,点击这里查看。 - Sobhan Atar

1
我遇到了同样的问题,最终解决了。您可以在add.blade.php的末尾添加几行代码。
 $('.date-picker').datepicker({
                format: 'yy/mm/dd',
                autoclose: true,
                todayHighlight: true
            });

0

插入日期时间的最简单方法。

$item->date= date('Y-m-d H:i:s', strtotime($request->date));

0

我曾经遇到导入Excel数据的同样问题,但最终我解决了这个问题。这是因为我的Excel语言是英语(美国),而默认的数据库格式是Y-M-D,也就是英语(英国)。所以,你应该将你的语言更改为英语(英国)。这样做就可以解决问题了。


0

参考

MYSQL 可以识别 YYYY-MM-DD 或者 YY-MM-DD 格式的日期值。您可以使用 /。这个 24/06/2017 被认为是无效的。请尝试使用 2017/06/24


0

这在我的 Laravel 5.6 中发生了,直到我将代码更改为

$table->date('last_date')->default(now());

0
  1. 我在新的迁移中删除了问题列:

$table->dropColumn('time_to_deliver');

  1. 创建了新的迁移文件,现在将'timestamp'替换为'time'作为类型:

$table->time('time_to_deliver')->nullable()->after('date_to_deliver');

  1. 在下一个迁移文件中完成了以下操作(在循环内):

$orderLcl = new Order;// 一个模型

$orderLcl->time_to_deliver = date("H:i",$mock_timestampLcl);

.....
$orderLcl->save();

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