сгруппировать cfdirectory по датеLastModified (дата, а не время)

Я использую базу данных 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>

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


person rob    schedule 03.10.2016    source источник


Ответы (3)


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

Чтобы сгруппировать по дате (только), добавьте столбец «только дата» в список 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">
person Leigh    schedule 03.10.2016

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

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

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

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

person Dan Bracuk    schedule 03.10.2016

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

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

person rob    schedule 03.10.2016
comment
(Изменить) создал новый запрос По какой-то конкретной причине? :) Если я не ошибаюсь, ручной запрос не нужен. Если вы запустите первый QoQ здесь, он даст те же результаты, но с немного меньшим количеством кода. Примечание: поскольку цель выводится, для cfloop нет. Просто используйте вложенные теги cfoutput. - person Leigh; 04.10.2016