Запрос запросов и CAST как дата - PullRequest
7 голосов
/ 20 марта 2012

Я использую 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>

В электронной таблице даты указаны в евро формате дд / мм / гг.Проблема в том, что функция CAST в запросе запросов превращает поле date_field из varchar в date, но в американский тип даты (месяц первый, день после).

Например, столбец Excel date_field содержит это значение 01/07/2011 (первое июля 2011 года, так как это евродата), но оно преобразуется в {ts '2011-01-07 00:00:00'}в запросе запросов.

Есть ли способ использовать CAST в запросе запросов для получения даты в европейском стиле?Чтобы обойти это в оракуле, вы должны сделать: to_date (date_field, 'DD: MM: YY'), но я не знаю, как с этим справиться.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Как упоминалось в некоторых комментариях, CAST применяет правила форматирования даты в США при разборе строк даты. Таким образом, неоднозначное значение типа 01/07/2011 всегда будет интерпретироваться как 7 января.

Поскольку формат даты известен, я думаю, что есть два простых варианта:

A) Выполните итерацию по запросу и проанализируйте строки даты вручную:

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

- == OR

B) Измените формат основной ячейки, как предложил Шон. Примените формат США, например 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" >
2 голосов
/ 20 марта 2012

Вы должны иметь возможность использовать SpreadsheetFormatColumn в столбцах даты с параметром dataformat, чтобы установить правильный формат даты для этого столбца.

Более подробную информацию о SpreadsheetFormatColumn и параметре dataformat можно найти в документации по ColdFusion 9:

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

1 голос
/ 21 марта 2012

Я думаю, вам нужно использовать функцию 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>.

Надеюсь, это поможет.

...