You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel迁移SQL Server时datetime格式不兼容问题求助

解决SQL Server datetime类型不支持微秒时间格式的问题

问题根源

SQL Server的datetime类型仅支持秒级精度(格式Y-m-d H:i:s),但Laravel通过$table->timestamps()创建字段后,默认会生成带微秒的时间戳(Y-m-d H:i:s.u),插入时就会触发类型转换报错,也就是你遇到的SQLSTATE[22007]错误。

修复方案

方案1:改用datetime2字段类型(推荐)

SQL Server的datetime2类型原生支持微秒精度,和Laravel默认的时间格式完美兼容。修改你的迁移文件:

// 替换原来的 $table->timestamps();
$table->datetime2('created_at')->nullable();
$table->datetime2('updated_at')->nullable();
// 或者更简洁的写法,指定微秒精度(6位是默认值)
$table->timestamps(6);

修改后运行迁移更新表结构:

php artisan migrate

如果是已存在的业务表,记得先备份数据,再执行迁移回滚后重新运行。

方案2:在模型中重写时间戳格式

如果不想改动数据库字段类型,直接在对应模型里重写getDateFormat方法,让Laravel输出不带微秒的时间:

class User extends Model
{
    protected function getDateFormat()
    {
        return 'Y-m-d H:i:s';
    }
}

这样该模型生成的created_at和updated_at就会是秒级格式,适配SQL Server的datetime类型。

方案3:全局统一修改时间戳格式

要是所有模型都需要适配这个规则,直接在App\Providers\AppServiceProvider的boot方法里添加全局设置:

use Illuminate\Database\Eloquent\Model;

public function boot()
{
    Model::setDateFormat('Y-m-d H:i:s');
}

这样所有模型都会自动使用不带微秒的时间格式,不用逐个修改模型文件。

内容的提问来源于stack exchange,提问作者Manouthé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:02:37