Группа cfdirectory по dateLastModified (дата не время)

Я использую ColdFusion 9 и базу данных Oracle. Я пытаюсь сгруппировать все файлы из каталога по dateLastModified с помощью:

<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 07:49:00 утра
  • Дата файла 3: 2016-08-03 07:49:00 утра

File 1 & 2 должна быть группа 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>

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

3 ответа

Решение

Так что я понял это. Спасибо @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>
    

Я надеюсь, что это поможет кому-нибудь там.

метод группировки файлов по дням, а не по времени

Чтобы сгруппировать по дате (только), добавьте столбец "только по дате" в свой список SELECT. Затем закажите новый столбец:

<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">

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

Шаг 2 - Добавьте столбец, используя queryaddcolumn.

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

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

Другие вопросы по тегам