2014-12-19 157 views
1

我能得到查詢的超過一個時間跨度說1小時 - 以15分鐘爲增量...顯示CFQUERY結果在時間跨度

我只是想停止顯示重複的結果,當主鍵是相同。

ie:如果東西從上午6:45開始 - 並在上午8:00結束 - 如果主鍵(masterid)相同,我只希望它跨越DIV一次。然後如果別的東西是早上8點用不同的主鍵 - 跨越該div時間框架等..

我考慮一個CFLOOP或類似物 - 檢查已掌握的或者是相同或不同的/

關於如何做到這一點的想法...

查詢代碼工作正常 - 就像我的顯示代碼...包含圖像給我想要做什麼的想法。

Output

<cfloop index="incr" from="0" to="#loopreps#"> 
    <cfoutput> 

    Loopreps is thru the time spans of 15 mins... 

    <cfquery name="scht" datasource="#ds#"> 
Proper Query 
</cfquery> 

    <cfif scht.recordcount is not 0> 
    <cfset mid = #scht.masterid#> 
    This is where I am lost to hold it to only 1 result when spanning time 


    Proper Display Across Div Height Span once if MasterID is same 

    </cfif> 

    </cfoutput> 
    </cfloop> 
+1

您使用CF進行任務的任何特定原因?你沒有說你正在使用哪個dbms,但是像SQL Server這樣的數據庫使這種任務變得更容易。無需在循環內查詢。 – Leigh

+0

網站全部內置於ColdFusion中 - 數據庫集成使用Access –

+2

作爲不是爲多線程網絡應用程序設計的桌面數據庫,Access真的限制了您的選擇。如果可以的話,升級到SQL Server。它更加靈活,快速版本免費。話雖如此,你仍然可以通過一個包含時間的輔助表以十五分鐘的增量來簡化它。只需在開始/結束時間將其他表添加到它。生成的查詢將包含您需要的所有時間間隔。然後格式化查詢輸出,但是你需要。 (編輯)在CTE單獨出現之前,我使用了SQL Server中的類似方法。 – Leigh

回答

1

我通常在開始循環之前把垃圾值。

<cfset CompareValue = "value that will never occur in real life"> 
<cfloop> 
<cfif FieldToCheck is not CompareValue> 
<cfset CompareValue = FieldToCheck> 
more code 
<cfelse> 
appropriate code, maybe nothing 
</cfif> 
</cfloop> 
+0

這是正確的方法 - 我只是有另一個循環繼續進行時間填充 - 我把垃圾值放在另一個循環之外。謝謝。 Thx也可以爲其他內容提供洞察 - 但Cold Fusion/Access在建立/拉取所需時間方面沒有任何問題。 –

2

您可以使用CFLOOP標記直接循環使用時間增量。例如,此代碼每15分鐘輸出一次。你可以將這樣一個循環與一個檢查(一個Q的Q可能)結合來提取可用性。

<cfloop index="tm" from="8:00 AM" to="5:00 PM" step="#createTimespan(0,0,15,0)#">  
    <cfoutput> <li>#TimeFormat(tm, "h:mm TT")#</li></cfoutput> 
</cfloop> 

請記住,這是一個很好的短迭代解決方案。如果長時間迭代,我會將該「step」屬性設置爲變量,而不是直接調用函數。如果真的長我可能會選擇別的東西。但是對於幾天的增量,我認爲它會工作得很好。在Interesting loop for date and time上看到這篇文章。祝你好運!

+0

閱讀鏈接文章後,我最初的印象是每次通過循環時使用一個變量而不是運行createTimespan()應該已經解決了所提到的性能問題。 –

3

正如評論所述,作爲桌面數據庫,MS Access相當有限。像SQL Server這樣的企業級數據庫爲這類任務提供了更大的功能,例如using CTE's

但是,只是爲了提供另一種視角,您也可以使用時間輔助表。 (在CTE出現之前,這是SQL Server中的一種常見方法)。您可以使用Mark's loop作爲基礎,以十五分鐘的增量輕鬆填充表格,格式爲00:0023:45。然後簡單地在預定的開始和結束時間加入該表格。 (Access需要額外的括號和派生表)。

SELECT ti.IntervalTime 
     , s.StartTime 
     , s.EndTime 
     , s.AppointmentName 
FROM TimeInterval ti LEFT JOIN 
     (
      SELECT AppointmentName, StartTime, EndTime 
      FROM ScheduleTable 
      WHERE ScheduleDate = <cfqueryparam value="#someDate#" cfsqltype="cf_sql_timestamp">  
     ) s 
     ON ( 
      ti.IntervalTime >= s.StartTime AND 
      ti.IntervalTime <= s.EndTime 
     ) 
WHERE ti.IntervalTime >= <cfqueryparam value="#fromTime#" cfsqltype="cf_sql_timestamp"> 
AND ti.IntervalTime <= <cfqueryparam value="#toTime#" cfsqltype="cf_sql_timestamp"> 
ORDER BY ti.IntervalTime 

結果將包含一個查詢中的所有間隔和約​​會,不需要循環。然後,您可以輸出您需要的結果。

IntervalTime | StartTime | EndTime | Appointment Name 
06:00:00  |   |   | 
06:15:00  |   |   | 
06:30:00  |   |   | 
06:45:00  | 06:45:00 | 08:00:00 | Edge 
07:00:00  | 06:45:00 | 08:00:00 | Edge 
07:15:00  | 06:45:00 | 08:00:00 | Edge 
07:30:00  | 06:45:00 | 08:00:00 | Edge 
.... 
+1

很好的詳細答案 –

+0

我的代碼讓我知道這是的。我只是想格式化爲1結果,並適當調整div的大小。所以我沒有遇到上述例子的麻煩... –

+0

是的,但使用50多個查詢 - *每個請求* - 做它是非常低效的。如果應用程序擁有多個用戶,這將是一個瓶頸。運行單個查詢效率更高。然後使用這些數據來確定預約跨越的時間間隔。例如,一個簡單的dateDiff(「n」)/ 15應該告訴你。 – Leigh