来自CF proc结果的无效时间格式化值

时间:2018-01-11 22:57:30

标签: coldfusion coldfusion-2016

我正在从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提供的默认驱动程序。

1 个答案:

答案 0 :(得分:0)

像丹说的那样,不要在以客户为中心的输出中放太多股票,但是......在这种情况下,你是部分正确的。问题由数据库驱动程序的更改引起,但是..我认为最终破坏旧代码的依赖于日期字符串(脆弱),而不是日期对象。

  

修复此问题,以便CF的StoredProc返回的数据正确

嗯,返回的值是正确的。这两个驱动程序只是使用不同的数据类型来表示它,使得它在以后由代码中的函数操作时看起来是不正确的。问题是CreateODBCDateTime("#end_date# #end_time#")强制将这些变量转换为字符串。由于数据库驱动程序更改,生成的字符串不同:

  • CF9.0.2驱动程序返回end_time作为字符串,恰好是格式hh:mm:ss
  • CF 2016驱动程序返回相同的时间,但使用不同的数据类型java.sql.Timestamp。该类似乎看起来不同when converted to a "string",即yyyy-mm-dd hh:mm:ss.ffffffffff

显然,当与end_date结合使用时,后一个字符串不再可解析,导致CreateODBCDateTime被阻塞。理所当然,CF9返回所需的确切时间格式很方便,但代码不应该依赖于日期和时间的原始字符串格式,正是出于这个原因。最适合使用日期对象和功能,它们不那么脆弱,更能抵抗驾驶员的变化,IMO。

修复选项

像你一样添加TimeFormat()可能是破坏性最小的变化。然而,像Shawn一样,我不喜欢将日期和时间分成不同的列。如果您无法更改数据库结构,则可以选择创建包含所有相同列的VIEW以及新列:combined date and time。然后在代码中使用VIEW和组合日期时间列。

虽然不太理想,但如果你绝对必须坚持字符串和旧代码,其他可能性是:

  1. 将“time”转换为sql查询中的String,即convert(varchar, yourTimeColumn, 108)

  2. 切换数据库驱动程序。使用Microsoft JDBC Driver创建“其他”数据源。我测试了4.2版,它返回java.sql.Time。转换为字符串时,生成hh:mm:ss,就像之前一样。

  3. 请记住,切换驱动程序有可能发现其他变化/怪异,因此请先彻底测试。