按 dateLastModified 对 cfdirectory 进行分组(日期不是时间)

group cfdirectory by dateLastModified (date not time)

我是运行 ColdFusion 9 和Oracle 数据库。我正在尝试使用 dateLastModified 对目录中的所有文件进行分组:

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

例如:

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>

有谁知道根据日期而不是时间对文件进行分组的不同方法吗?

第 1 步 - 使用 cfdirectory 获取查询对象。

第 2 步 - 使用 queryaddcolumn 添加列。

第 3 步 - 循环查询。在新列上使用 querySetCell 和 dateformat

第 4 步 - 使用 cfoutput,按新列分组,执行您需要执行的操作。您的 cfdirectory 标签已经对数据进行了排序。

method to group files based on days not time

要(仅)按日期分组,请将 "date only" 列添加到您的 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>

I get no records.

FWIW,原因是尽管使用了 CAST ... as Date,显然 CF 仍然在内部保留了 "time" 部分。所以 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">

所以我想通了。感谢@Dan 和@Leigh 的建议。我将两者作为指南来获得我想要的东西。

  1. 我用cfdirectory得到了一个查询对象。
  2. 我使用 QueryNewQueryAddRowQuerySetCell 创建了一个新查询。
  3. 在新查询的列中包含格式化日期 (mm/dd/yyyy)。确保在设置列名 QueryNew.
  4. 时将列声明为 varchar 而不是 date
  5. 我使用了 cfloopgroup 选项以及 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>
    

我希望它能帮助到那里的任何人。