group cfdirectory by dateLastModified(date not time)

时间:2016-10-03 15:59:57

标签: coldfusion coldfusion-9 cfdirectory

我正在运行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 am
  • 文件日期2:2016-10-03 07:49:00 am
  • 文件日期3:2016-08-03 07:49:00 am

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 个答案:

答案 0 :(得分:2)

  

根据天数而不是时间对文件进行分组的方法

要按日期分组(仅限),请仅添加&#34;日期&#34;列到SELECT列表。然后按新列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仍然保留了#34;时间&#34;部分内部。所以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 :(得分:1)

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

第2步 - 使用queryaddcolumn添加列。

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

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

答案 2 :(得分:0)

所以我明白了。感谢@Dan和@Leigh提出的建议。我用这两个作为指南来获得我想要的东西。

  1. 我使用cfdirectory来获取查询对象。
  2. 我使用QueryNewQueryAddRowQuerySetCell创建了一个新查询。
  3. 在新查询的列中包含格式化日期(mm / dd / yyyy)。设置列名varchar时,请确保将列声明为date而不是QueryNew
  4. 我使用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>
    
  5. 我希望它可以帮助那里的任何人。