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数据源:- 进入「配置」→「高级」,检查「日期格式」「时间格式」与生产服务器一致;
- 启用「使用区域设置」选项,让驱动使用与CF匹配的区域规则解析日期字符串。
指定CF默认日期格式
若区域设置调整无效,可直接强制CF输出SQL兼容的日期格式:- 全局设置:CF管理后台 → 服务器设置 → 设置,将「默认日期格式」改为
yyyy-mm-dd HH:nn:ss; - 应用级设置:在
Application.cfc中添加this.defaultDateFormat = "yyyy-mm-dd HH:nn:ss";。
- 全局设置:CF管理后台 → 服务器设置 → 设置,将「默认日期格式」改为
统一SQL Server语言与日期格式
在备份服务器的SSMS中执行以下语句,对比生产服务器的结果:SELECT @@LANGUAGE, DATEFORMAT, DATEFIRST;若存在差异:
- 修改CF连接账号的默认语言:
ALTER LOGIN [CF连接账号] WITH DEFAULT_LANGUAGE = [生产服务器语言]; - 修改数据库日期格式:
ALTER DATABASE [目标数据库名] SET DATEFORMAT mdy;(替换为生产对应的格式)
- 修改CF连接账号的默认语言:
切换ODBC驱动
尝试将数据源驱动从「SQL Server」切换为「SQL Server Native Client 11.0」,Native Client对日期类型的兼容性更优,可能自动适配CF输出的日期字符串。
内容的提问来源于stack exchange,提问作者John H
相关产品推荐
相关产品推荐

