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_from
0000-00-00 & active_till
0000 -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_at
和updated_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问题解决(示例代码