ColdFusion不同版本返回的查询结果不同。

4
我们正在CF9和CF10两个不同版本的ColdFusion上运行cfquery。当结果返回时,在这两个版本中,日期的格式化方式不同。
查询如下:
SELECT TOP 100 CONVERT(DATE,Field1,121),Field2
FROM A_TABLE

在CF9中,字段1的返回值看起来像是2010-06-01
在Cf10中,字段1的返回值看起来像是{ts '2010-06-01 00:00:00'}
有其他人注意到这个差异吗?我们已经搜索了CF文档,没有注意到这个变化。

3
如果您使用 DateFormat 函数,那么结果都是相同的。 - Cory Fail
1
你是如何查看这些数据的? - Adam Cameron
看起来在CF9上,ColdFusion没有返回Microsoft文档中所宣传的格式,http://msdn.microsoft.com/en-us/library/ms187928.aspx。 - Dan Bracuk
我正在通过执行cfdump查看这些数据。但是这种格式也会传递到其他输出,包括serializeJson。 - tbdevmanager
每当你需要格式化日期/时间时,使用dateFormat()timeFormat()和/或(在Cf 10中)dateTimeFormat()-请参见我下面的答案。 - Scott Stroz
@DanBracuk: 这个链接页面显示的格式应该是:ODBC标准(带毫秒)yyyy-mm-dd hh:mi:ss.mmm(24小时制)。我没有看到毫秒,但它似乎更接近。 - James A Mohler
1个回答

6
返回结果:

返回的数据是相同的。您在CF10中看到的是ColdFusion显示日期/时间对象的方式。(根据Miguel-F的反馈进行了编辑)

无论何时输出日期/时间,您都可以(也应该)使用dateFormat()timeformat()(以及在CF 10中使用datetimeformat())以标准化的方式格式化日期/时间。


1
你在CF10中看到的是ColdFsuion从数据库中显示“原始”日期/时间的方式 - 我不认为这是准确的。区别在于CF10似乎返回一个日期/时间对象,而CF9似乎只返回一个字符串表示。输出{ts'2010-06-01 00:00:00'}是ColdFusion显示日期/时间对象的方式。 - Miguel-F
2
@Miguel-F : 从技术上讲,CONVERT(DATE, ...) 应该在两个版本中都返回一个 java.sql.Date 对象。这只是 CF 选择如何显示它的问题。CF9 必须使用 Date.toString(),这就解释了为什么结果是 "yyyy-mm-dd"。我猜 CF10 或者以不同的方式显示了 java.sql.Date -OR- 查询可能返回了一个 Timestamp 对象。你需要转储查询列类来确定,例如 #queryName.field1[1].getClass().name# - Leigh
@Tim - 话虽如此,不要相信 cfdump 这样的东西。它只是用于调试,并且偏向于“人类友好”的表示方式而非精度(参见 http://stackoverflow.com/questions/18586356/scientific-notation-with-precisionevaluate-in-coldfusion/18594912#18594912)。正如 Scott 所说,确保一致格式的方法是使用 date/time/dateTimeFormat() - Leigh
@Leigh 我按照你说的方式对该列进行了转储,你是正确的,CF10返回java.sql.Date,CF9返回java.lang.String。 - tbdevmanager
1
哦,如果serializeJSON正在使用某种自动转换来处理日期时间列,则您可能需要a)在SQL中将值强制转换为字符串,或者b)向查询对象添加一个varchar列,然后循环遍历并手动使用dateFormat()填充varchar列。 - Leigh
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接