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

CF10备份服务器中#now()#引发SQL日期转换异常求助

问题背景

我们为遗留ColdFusion 10应用搭建备份服务器,生产与备份服务器配置完全一致:

  • MS SQL 2014 12.0.6179.1(兼容SQL Server 2008)
  • ColdFusion 10,284825
  • ODBC "SQL Server"驱动版本10.00.14393.7155
  • Windows Server 2016(CF管理后台均显示为Windows Server 2012)
  • 已安装的ODBC驱动(ODBC Driver 11 for SQL Server、SQL Server、SQL Server Native Client 11.0)相同

但备份服务器上使用#now()#的SQL语句执行失败,报错:varchar数据类型转换为datetime数据类型导致值超出范围。例如:

INSERT INTO User_Log VALUES ('test', 'None', 'Log In', 'The user logged in', #now()#)

而使用{ts 'yyyy-mm-dd HH:mm:ss'}格式的语句在两边均能正常执行:

INSERT INTO User_Log VALUES ('test', 'None', 'Log In', 'The user logged in', {ts '2024-07-23 16:44:11'})

需求:不修改遗留代码(大量使用#now()#),通过平台配置解决问题。

解决建议
  • 统一ColdFusion区域设置
    CF会根据服务器区域设置格式化now()输出的日期字符串,若备份服务器区域的日期格式(如DD/MM/YYYY)与生产(如MM/DD/YYYY)不一致,当日期日份>12时会触发SQL转换错误。
    操作:登录CF管理后台 → 服务器设置 → 区域设置,确保备份服务器的区域、日期格式、时间格式与生产完全一致。可在CF页面输出#now()#直接对比两边的字符串格式。

  • 调整ODBC数据源配置
    打开备份服务器的ODBC数据源管理器,找到对应SQL Server数据源:

    1. 进入「配置」→「高级」,检查「日期格式」「时间格式」与生产服务器一致;
    2. 启用「使用区域设置」选项,让驱动使用与CF匹配的区域规则解析日期字符串。
  • 指定CF默认日期格式
    若区域设置调整无效,可直接强制CF输出SQL兼容的日期格式:

    • 全局设置:CF管理后台 → 服务器设置 → 设置,将「默认日期格式」改为yyyy-mm-dd HH:nn:ss;
    • 应用级设置:在Application.cfc中添加this.defaultDateFormat = "yyyy-mm-dd HH:nn:ss";。
  • 统一SQL Server语言与日期格式
    在备份服务器的SSMS中执行以下语句,对比生产服务器的结果:

    SELECT @@LANGUAGE, DATEFORMAT, DATEFIRST;
    

    若存在差异:

    • 修改CF连接账号的默认语言:ALTER LOGIN [CF连接账号] WITH DEFAULT_LANGUAGE = [生产服务器语言];
    • 修改数据库日期格式:ALTER DATABASE [目标数据库名] SET DATEFORMAT mdy;(替换为生产对应的格式)
  • 切换ODBC驱动
    尝试将数据源驱动从「SQL Server」切换为「SQL Server Native Client 11.0」,Native Client对日期类型的兼容性更优,可能自动适配CF输出的日期字符串。

内容的提问来源于stack exchange,提问作者John H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:44