我正在使用cfspreadsheet从excel表中读取值,然后我查询查询以对日期字段进行排序,因为cfspreadsheet返回的所有字段都是“VarChar”类型。这是代码:
<cfspreadsheet action = "read" query = "mySpreadsheet" src = "mp.xls" sheet="1" rows="2-178">
<cfquery name="mySpreadsheet2" dbtype="query">
select
(CAST(date_field as DATE)) as mydate
from mySpreadsheet order by mydate
</cfquery>
在电子表格中,日期为欧元格式dd / mm / yy。问题是查询查询中的CAST函数将'date_field'从varchar转换为日期,但美国日期类型(月份优先,后一天)。
例如,excel date_field列包含此值01/07/2011(2011年7月1日,因为它是Eurodate)但它在查询中转换为{ts'2011-01-07 00:00:00'}查询。
有没有办法在查询查询中使用CAST来生成欧式日期?要在oracle中解决这个问题,你可以这样做:to_date(date_field,'DD:MM:YY')但我不知道如何解决这个问题。
答案 0 :(得分:3)
如某些评论中所述,CAST
在解析日期字符串时会应用美国日期格式规则。因此像01/07/2011
这样的含糊不清的值将始终被解释为1月7日。
由于日期格式已知,我认为最简单的两个选项是:
A)遍历查询并手动解析日期字符串:
<cfloop query="yourQuery">
<cfif LSIsDate(yourQuery.DateCol, "English (UK)")>
<cfset yourQuery.DateCol[currentRow] = LSParseDateTime(yourQuery.DateCol, "English (UK)") />
</cfif>
</cfloop>
- == OR
B)改变Sean建议的基础单元格格式。应用美国格式,如mm/dd/yyyy
,以便CAST
正确解析返回的字符串。或者您可以简单地应用像yyyy-mm-dd
这样的非模糊格式,即使是字符串也可以正确排序。
<!--- read in the workbook --->
<cfset sheet = spreadSheetRead("c:/path/file.xls")>
<!--- apply the new format and save back to disk --->
<cfset SpreadSheetFormatColumn(sheet, {dataFormat="yyyy-mm-dd"}, yourDateColumn)>
<cfset SpreadSheetWrite(sheet, "c:/path/file.xls", true)>
<cfspreadsheet action="read" query="yourQuery" src="c:/path/file.xls" sheet="1" rows="2-178" >
答案 1 :(得分:2)
您应该能够在SpreadsheetFormatColumn
设置的日期列上使用dataformat
来设置该列的正确日期格式。
您可以在ColdFusion 9文档中找到有关SpreadsheetFormatColumn
和dataformat
设置的更多信息:
SpreadsheetFormatColumn:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6806.html
格式选项:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6747.html
答案 2 :(得分:1)
我认为你想要做的是使用setLocale()
函数将语言环境设置为欧洲地区,然后使用CAST()
函数进行查询查询:
<cfset setLocale("French (Standard)") />
<cfquery name="mySpreadsheet2" dbtype="query">
select (CAST(date_field as DATE)) as mydate
from mySpreadsheet order by mydate
</cfquery>
我刚刚尝试使用从数据库中选择的VARCHAR(使用Oracle TO_CHAR(date_field, 'DD/MM/YYYY')
)并且它可以工作。不知道你是否会对<cfspreadsheet>
产生相同的结果。
希望这有帮助。