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é
相关产品推荐
相关产品推荐

