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

Laravel 10连接SQL Server时间戳转换超出有效范围问题求助

解决方案
  • 检查应用与数据库时区一致性
    执行SQL Server查询确认服务器时区:

    SELECT SYSDATETIMEOFFSET();
    

    对比Laravel .env 文件中的 APP_TIMEZONE 配置(例如 Asia/Shanghai),确保两者时间范围落在SQL Server datetime 类型的有效区间(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:23