我正在使用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>
Run Code Online (Sandbox Code Playgroud)
在电子表格中,日期为欧元格式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'),但我不知道如何解决这个问题.
正如一些评论中提到的,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>
Run Code Online (Sandbox Code Playgroud)
-==或
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" >
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5913 次 |
| 最近记录: |