0000-00-00 作为 Laravel 中的日期

Posted

技术标签:

【中文标题】0000-00-00 作为 Laravel 中的日期【英文标题】:0000-00-00 as date in Laravel 【发布时间】:2018-12-19 16:16:31 【问题描述】:

我必须在现有(旧)数据库上构建 Laravel 应用程序。此数据库使用 0000-00-00 作为默认日期。我无法更改它,因为当前系统(也将保留)使用它来检查某些东西是否在无限时间内处于活动状态(例如:active_from0000-00-00 & active_till0000 -00-00 表示它始终处于活动状态。

我想在现有表中添加一列,所以我创建了一个迁移:add_columnname_to_tablename_table。在up() 函数中我做了:$table->string('columnname')。当我运行迁移时,我得到:

SQLSTATE[22007]:日期时间格式无效:1292 日期时间不正确 值:'0000-00-00 00:00:00' 用于第 1 行的列 active_from

旧系统太大,无法对此进行任何更改——而且我无权更改它。

有没有办法让 Laravel 接受 0000-00-00 作为有效的日期(时间)?

【问题讨论】:

默认值可以使用字符串,否则日期格式 disablingNO_ZERO_DATE sql_mode 在运行插入之前运行查询SET SESSION sql_mode = REPLACE(@@sql_mode. ',NO_ZERO_DATE'. ''); 可能有助于您的连接会话 更改所有日期以更正日期值并将默认值设置为 current_value 或某个有效值 【参考方案1】:

这主要是一个 mysql 问题,因为较新版本的 MySql 禁用了零日期。此外,NO_ZERO_DATE 模式已被弃用(请参阅:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_date)。为了解决这个问题,您可以将数据库中的所有零日期更改为 unix 纪元时间1970-01-01 00:00:00(这是我在升级 MySql 后必须做的)。

【讨论】:

【参考方案2】:

Laravel 默认使用严格模式,我已通过将 config/database.php 中的 strict => true 更改为 strict => false 来解决此问题。

【讨论】:

【参考方案3】:

strtotime 将在日期无效时返回一个小于零的数字,例如 MySQL 中常见的 0000-00-00 00:00:00。确保传递对象类型日期或碳:

  return strtotime(date or carbon object) < 0 ? null : date

【讨论】:

【参考方案4】:

我发现你需要先将SQL列类型设置为TIMESTAMP,然后在存储数据时使用date()内置php函数

$myModel->my_date = date('y-m-d');

它将像created_atupdated_at一样以正确的格式保存。

保存时的示例数据:

"start_date": "2021-08-14 00:00:00",

【讨论】:

以上是关于0000-00-00 作为 Laravel 中的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何使用查询构建在 Laravel 中执行 WHERE NOT

将 C# 日期时间转换为 0000-00-00 00:00:00 到 MySQL

Incorrect datetime value: '0000-00-00 00:00:00' for column 'addtime' at row问题解决(示例代码

mysql datetime NOT NULL DEFAULT '0000-00-00 00:00:00' 无效

MySQL datetime的更新,删除网上的一些老概念

laravel 自定义过滤中间件