7

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からdateに変換しますが、アメリカのタイプの日付(月の最初、翌日)に変換することです。

たとえば、Excelのdate_field列にはこの値01/07/2011(Eurodateであるため2011年7月1日)が含まれていますが、クエリのクエリでは{ts'2011-01-0700:00:00'}に変換されます。

クエリのクエリでCASTを使用して、ヨーロッパスタイルの日付を生成する方法はありますか?オラクルでこれを回避するには、to_date(date_field、'DD:MM:YY')を実行しますが、ここでこれに取り組む方法がわかりません。

4

3 に答える 3

3

いくつかのコメントで述べられているように、CAST日付文字列を解析するときに米国の日付フォーマット規則を適用します。したがって、のようなあいまいな値01/07/2011は常に1月7日として解釈されます。

日付形式がわかっているので、最も簡単な2つのオプションは次のいずれかだと思います。

A)クエリを繰り返し処理し、日付文字列を手動で解析します。

<cfloop query="yourQuery">
    <cfif LSIsDate(yourQuery.DateCol, "English (UK)")>
        <cfset yourQuery.DateCol[currentRow] = LSParseDateTime(yourQuery.DateCol, "English (UK)") />
    </cfif>
</cfloop>

-==または

B)ショーンが提案したように、基になるセル形式を変更します。のようなUS形式を適用し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" >
于 2012-03-21T04:39:18.357 に答える
2

SpreadsheetFormatColumn日付列を使用して、dataformatその列に適切な日付形式を設定できるようにする必要があります。

詳細SpreadsheetFormatColumndataformat設定については、ColdFusion9のドキュメントを参照してください。

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

于 2012-03-20T16:31:00.110 に答える
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>

(Oracleを使用して)データベースから選択したVARCHARで試してみたところ、機能TO_CHAR(date_field, 'DD/MM/YYYY')しました。ただし、同じ結果が得られるかどうかはわかりません<cfspreadsheet>

お役に立てれば。

于 2012-03-21T00:06:38.610 に答える