2016-10-03 103 views
1

我正在運行ColdFusion 9和Oracle數據庫。我從一個目錄由dateLastModified使用設法組中的所有文件:group cfdirectory by dateLastModified(日期不是時間)

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

例如:

  • 文件1日期:2016年10月3日上午11時49分○○秒
  • 2016年8月3日上午七時49分00秒

File 1 & 2 S:2016年10月3日上午七時49分00秒

  • 文件3日期:文件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> 
    

    有沒有人知道一個不同的方法來分組文件基於天而不是時間?

  • 回答

    0

    所以我想通了。感謝@Dan和@Leigh的建議。我用這兩個作爲指南得到我想要的。

    1. 我用cfdirectory來得到查詢對象。
    2. 我使用QueryNewQueryAddRowQuerySetCell創建了一個新的查詢。
    3. 新查詢的列中包含格式化日期(mm/dd/yyyy)。確保在設置列名稱QueryNew時聲明該列爲varchar而不是date
    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> 
      

    我希望它可以幫助那裏的人。

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