2016-10-03 2 views
1

Я запускаю ColdFusion 9 и базу данных Oracle. Я пытаюсь объединить все файлы из каталога с помощью dateLastModified с помощью:group cfdirectory by dateLastModified (date not time)

<cfdirectory action="LIST" 
    directory="#path_to_files#" 
    name="res" 
    sort="datelastmodified desc,name ASC" 
    filter="#filters#"> 

Например:

  • Дата Файл 1: 2016-10-03 11:49:00 утра
  • Дата Файл 2: 2016-10-03 7:49:00 утра
  • Дата Файл 3: 2016-08-03 7:49:00 утра

File 1 & 2 ов hould быть группой 1 и File 3 должна быть группа 2

Если я использую запрос из запроса, как можно сравнить дату, основанную на дней не раз? Это то, что у меня есть до сих пор, но это не работает. У меня нет записей.

<cfquery name="getfiles" dbtype="query"> 
     SELECT name, datelastmodified 
     FROM res 
     WHERE CAST([datelastmodified] as date) = CAST(<cfqueryparam cfsqltype="CF_SQL_DATE" value="#d#"/> as date) 
    </cfquery> 

Кто-нибудь знает о другом методе группировки файлов на основе дней, не раз?

ответ

0

Так что я понял. Спасибо @Dan и @Leigh за их предложение. Я использовал как гиды, чтобы получить то, что я хотел.

  1. Я использовал cfdirectory, чтобы получить объект запроса.
  2. Я создал новый запрос, используя QueryNew, QueryAddRow и QuerySetCell.
  3. В столбцах нового запроса содержится форматированная дата (мм/дд/гггг). Убедитесь, что вы указали столбец как varchar не date при настройке имен столбцов QueryNew.
  4. Я использовал cfloop и group вариант и cfoutput для отображения записей.

    <cfset path_to_files = "d:\inetpub\wwwroot\mailrideli\webrpt\"> 
    <cfset filters = "*.pdf|*.txt|*.xls"> 
    <cfdirectory action="LIST" directory="#path_to_files#" name="res" sort="datelastmodified desc,name ASC" filter="#filters#"> 
    
    <cfset q = QueryNew("Name,dateformated,datelastmodified, size","Varchar, Varchar, date, varchar")> 
    <cfset count = 1> 
    <cfset newRow = QueryAddRow(q,res.recordCount)> 
    
    <cfloop query="res"> 
        <cfset d = DateFormat(res.dateLastModified,"mm/dd/yyyy")> 
        <cfset temp = QuerySetCell(q, "Name", "#res.name#", count)> 
        <cfset temp = QuerySetCell(q, "dateformated", "#d#", count)> 
        <cfset temp = QuerySetCell(q, "datelastmodified", "#res.datelastmodified#", count)> 
    <cfset temp = QuerySetCell(q, "size", "#res.size#", count)> 
    
    <cfset count += 1> 
    </cfloop> 
    
    <cfoutput> 
        <cfloop query="q" group="dateformated"> 
            #q.dateformated#<br /> 
    
    
            <table> 
             <tr> 
              <th>File Name</th> 
              <th>Size (bytes)</th> 
              <th>Last Modified</th> 
             </tr> 
             <cfloop> 
    
              <tr> 
               <td><a href="#q.name#">#q.name#</a></td> 
               <td>#q.size#</td> 
               <td>#dateformat(q.dateLastModified, 'mm/dd/yyyy')# #timeformat(q.dateLastModified, 'hh:mm:ssTT')#</td> 
              </tr> 
    
             </cfloop> 
            </table> 
        </cfloop> 
        </cfoutput> 
    

Я надеюсь, что это помогает кто-то там.

+0

(Изменить) * создал новый запрос * Любая конкретная причина? :) Если я не понимаю, ручной запрос не нужен. Если вы запустите [первый QoQ здесь] (http://stackoverflow.com/a/39837141/104223), он дает те же результаты с меньшим количеством кода. Сторона примечания, поскольку цель выводится, нет для cfloop. Просто используйте вложенные теги cfoutput. – Leigh

1

Шаг 1 - Используйте cfdirectory для получения объекта запроса.

Шаг 2 - Добавить столбец с помощью queryaddcolumn.

Шаг 3 - Прокрутите запрос. Используйте querySetCell и dateformat в своем новом столбце

Шаг 4 - используйте команду cfoutput, группа из вашего нового столбца, чтобы сделать то, что вам нужно сделать. В вашем теге cfdirectory уже отсортированы данные.

2

метод группировать файлы на основе дней не время

К группе по дате (только), добавить «только дата» столбец в списке ЗЕЬЕСТ. Тогда ORDER BY новый столбец:

<cfquery name="qSortedFiles" dbtype="query"> 
    SELECT CAST(DateLastModified AS Date) AS DateOnly 
      , Name 
      , DateLastModified 
    FROM getFiles 
    ORDER BY DateOnly 
</cfquery> 

<cfoutput query="qSortedFiles" group="DateOnly"> 
    #DateOnly#<br> 
    <cfoutput> 
     - #DateLastModified#<br> 
    </cfoutput> 
</cfoutput> 

я не получаю никаких записей.

FWIW, причина в том, что, несмотря на то, что, несмотря на использование CAST ... as Date, очевидно, CF все еще сохраняет часть времени. Таким образом, пункт WHERE еще сравнивать яблоки и апельсины:

<!--- comparing Date and Time to Date (only) 
    WHERE 2016-08-03 07:49:00 am = 2016-08-03 00:00:00 am 

Вместо использования равенства сравнения, использовать этот подход:

WHERE DateLastModified >= {TheStartDateAtMidnight} 
    AND DateLastModified < {TheNextDayAtMidnight} 

Этот тип сравнения является более гибким, поскольку он работает как с датой и временные столбцы - и даты (только).

WHERE CAST(DateLastModified AS Date) >= <cfqueryparam value="#someDate#" cfsqltype="cf_sql_date"> 
AND CAST(DateLastModified AS Date) < <cfqueryparam value="#dateAdd('d', 1, someDate)#" cfsqltype="cf_sql_date">