Laravel 10连接SQL Server时间戳转换超出有效范围问题求助
解决方案
检查应用与数据库时区一致性
执行SQL Server查询确认服务器时区:SELECT SYSDATETIMEOFFSET();对比Laravel
.env文件中的APP_TIMEZONE配置(例如Asia/Shanghai),确保两者时间范围落在SQL Serverdatetime类型的有效区间(1753-01-01 至 9999-12-31)。若时区不匹配导致生成的时间超出范围,调整APP_TIMEZONE为与数据库一致的时区。替换数据库字段类型为datetime2
SQL Server的datetime类型范围有限,而datetime2支持更大的时间范围且精度更高。修改roles表的时间戳字段类型:ALTER TABLE roles ALTER COLUMN created_at datetime2 NOT NULL; ALTER TABLE roles ALTER COLUMN updated_at datetime2 NOT NULL;Laravel对
datetime2的兼容性更好,能避免多数类型转换问题。移除自定义$dateFormat配置
Laravel 10默认通过Carbon自动处理时间戳,手动设置$dateFormat = 'Y-m-d H:i:s'可能与SQL Server驱动的预期格式冲突。删除ModelBase中的$dateFormat定义,让框架自动适配数据库的时间格式。调整数据库连接的datetime_format配置
在config/database.php的sqlsrv连接配置中,添加或修改datetime_format:'sqlsrv' => [ 'driver' => 'sqlsrv', // ... 其他配置 'datetime_format' => 'Y-m-d H:i:s', ],确保驱动使用正确的格式解析时间戳。
验证生成的时间戳有效性
在插入操作前临时打印时间戳值,确认无异常:dd(Carbon::now()->format('Y-m-d H:i:s'));检查输出是否为合法的日期时间格式,排除代码中意外修改时间的情况。
内容的提问来源于stack exchange,提问作者albertosetim
相关产品推荐
相关产品推荐

