我正在将我们的一个应用程序从ColdFusion 9.01移动到ColdFusion 11,遇到一种情况,我无法按照我希望的方式使用" DateFormat"来格式化日期。我阅读了文档,因为CF版本的内容已经发生了变化,但老实说,我无法弄清楚为什么它不起作用。它在CF 9中运行得很漂亮。我知道它可能非常容易,但我只是没有看到它。
查询(Oracle DB)为我提供了过去30天的列表,循环只是重新格式化日期输出" 2014-07-01 00:00:00.0"为了一个更友好的2014年7月1日的展示,除了我无法将其格式化为" dd-mmm-yyyy"它只是从查询中吐出原始输出。我硬编码了通常会有cfquerparam的日期。有什么想法吗?
<cfquery name="qryDateArray" datasource="#request.db#">
select trunc(to_date('07/01/2014', 'mm/dd/yyyy') + 1 - rownum) as ref_date
from dual connect by rownum <= 30
</cfquery>
<cfloop from="1" to="#qryDateArray.recordcount#" index="j">
<cfset qryDateArray.ref_date[j] = DateFormat(qryDateArray.ref_date[j], "dd-mmm-yyyy")>
</cfloop>
<cfoutput>
<cfdump var="#qryDateArray#">
</cfoutput>
答案 0 :(得分:1)
如果您给我们一个便携式测试用例而不是依赖于您的数据库的测试用例,那就太好了,但我怀疑是因为ColdFusion对查询列的类型管理变得更加严格。
因此CF认为您的ref_date
列属于日期类型,因此当您尝试将格式化的字符串放回查询列时,CF会尝试(并成功)将字符串转换回日期。 / p>
除了:
我不得不想知道你为什么不从一开始就在数据库中格式化数据字符串,只是按照你需要的方式返回它,而不是返回别的东西,然后循环调整它来调整它......?
答案 1 :(得分:1)
我无法在CF11上测试这个,因为我没有方便。我确实验证了您的代码虽然返回了结果,但是我在CF10环境中运行它时的解释。所以你可以做的是在查询对象中添加一个列并将其定义为varchar并将格式化的数据添加到该对象中。这反过来又抛弃了格式化的日期。
<cfquery name="qryDateArray" datasource="#request.db#">
select trunc(to_date('07/01/2014', 'mm/dd/yyyy') + 1 - rownum) as ref_date
from dual connect by rownum <= 30
</cfquery>
<cfset aryData = [] />
<cfloop from="1" to="#qryDateArray.recordcount#" index="j">
<cfset ArrayAppend(aryData, DateFormat(qryDateArray.ref_date[j], "dd-mmm-yyyy")) />
</cfloop>
<cfset QueryAddColumn(qryDateArray, "STRDATE", "VarChar", aryData) />
<cfoutput>
<cfdump var="#qryDateArray#">
</cfoutput>
如果依赖于查询列名称,那么可以使用Ben解释的方法来对列进行重命名:http://www.bennadel.com/blog/357-ask-ben-changing-coldfusion-query-column-names.htm