我正在从CF 9升级到CF 2016,并且看到从StoredProc调用(cfscript)返回的数据中有一些奇怪的行为。
数据库中的数据类型为time(7)
。我遇到问题的数据库值是:00:00:00.0000000
。
我在execute().getProcResultSets().results
行之后直接转储结果。
在CF 9中,cfdump中的值为00:00:00.0000000
,这是正确的。
在CF 2016中,cfdump中的值为1970-01-01 00:00:00.0
这种差异导致我的代码“无效的日期时间错误”:
CreateODBCDateTime("#end_date# #end_time#")
我通过使用TimeFormat()
函数调用来解决这个问题,但是我想知道是否还有其他选项可以解决这个问题,因此CF的StoredProc返回的数据是正确的,以消除任何可能的混淆。
更新:我使用的是Adobe提供的默认驱动程序。
答案 0 :(得分:0)
修复此问题,以便CF的StoredProc返回的数据正确
嗯,返回的值是正确的。这两个驱动程序只是使用不同的数据类型来表示它,使得它在以后由代码中的函数操作时看起来是不正确的。问题是CreateODBCDateTime("#end_date# #end_time#")
强制将这些变量转换为字符串。由于数据库驱动程序更改,生成的字符串不同:
end_time
作为字符串,恰好是格式hh:mm:ss
yyyy-mm-dd hh:mm:ss.ffffffffff
。 显然,当与end_date
结合使用时,后一个字符串不再可解析,导致CreateODBCDateTime被阻塞。理所当然,CF9返回所需的确切时间格式很方便,但代码不应该依赖于日期和时间的原始字符串格式,正是出于这个原因。最适合使用日期对象和功能,它们不那么脆弱,更能抵抗驾驶员的变化,IMO。
修复选项
像你一样添加TimeFormat()
可能是破坏性最小的变化。然而,像Shawn一样,我不喜欢将日期和时间分成不同的列。如果您无法更改数据库结构,则可以选择创建包含所有相同列的VIEW以及新列:combined date and time。然后在代码中使用VIEW和组合日期时间列。
虽然不太理想,但如果你绝对必须坚持字符串和旧代码,其他可能性是:
将“time”转换为sql查询中的String,即convert(varchar, yourTimeColumn, 108)
切换数据库驱动程序。使用Microsoft JDBC Driver创建“其他”数据源。我测试了4.2版,它返回java.sql.Time。转换为字符串时,生成hh:mm:ss
,就像之前一样。
请记住,切换驱动程序有可能发现其他变化/怪异,因此请先彻底测试。