2014-12-19 6 views
1

이 1 시간을 말할 시간 범위 동안 CFQUERY이 결과 표시 -로 15 분 단위로 기본 키가있을 때 ... 난 그냥 반복적 인 결과를 표시 중지하려고나는의 시간 범위에 걸쳐 쿼리를 얻을 수있어

을 같은.

예 : 오전 6시 45 분에 시작하여 오전 8시에 끝나는 경우 - 기본 키 (masterid)가 동일하면 DIV를 한 번만 확장하려고합니다. 뭔가 다른 기본 키 8am에있는 경우 그리고 - 등 사업부 기간 ...

가 나는 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에 내장되어 있습니다. 데이터베이스 통합에서 액세스를 사용합니다. –

+2

Access는 멀티 스레드 웹 응용 프로그램 용으로 설계되지 않은 데스크톱 데이터베이스로서 실제로 옵션을 제한합니다. 가능하다면 SQL Server로 업그레이드하십시오. 훨씬 더 유연하고 익스프레스 버전은 무료입니다.그럼에도 불구하고, 시간을 포함하는 보조 테이블을 15 분 단위로 사용함으로써이를 단순화 할 수 있습니다. 시작/종료 시간에 다른 테이블에 간단히 가입하십시오. 결과 쿼리에는 필요한 모든 간격이 포함됩니다. 그런 다음 쿼리 출력을 형식화하십시오. (편집) 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> 

이것은 짧은 반복을위한 좋은 해결책이라는 것을 명심하십시오. 긴 반복을 수행하는 경우 함수를 직접 호출하는 대신 변수에 "단계"특성을 설정합니다. 이 실제로 일 경우 나는 다른 것을 선택할 것입니다. 그러나 2 일 동안의 증분으로는 완벽하게 작동 할 것입니다. 이 게시물을 Interesting loop for date and time에서보십시오. 행운을 빕니다!

+0

링크 된 아티클을 읽었을 때 처음 느낌은 루프를 통해 매번 createTimespan()을 실행하는 대신 변수를 사용하면 언급 된 성능 문제를 분류해야한다는 것이 었습니다. –

3

메모에서 언급했듯이 데스크톱 데이터베이스 인 MS Access는 다소 제한적입니다. SQL Server와 같은 엔터프라이즈 데이터베이스는 이와 같은 작업 (예 : using CTE's)에 대해 훨씬 뛰어난 기능을 제공합니다.

그러나 다른 시각을 제공하기 위해 시간 대신 보조 표를 사용할 수도 있습니다. (이것은 CTE의 출현 이전 SQL Server에서 일반적인 접근 방식이었습니다). 을 기준으로 00:00에서 23:45 사이에 15 분 단위로 표를 쉽게 채울 수 있습니다. 그런 다음 예정된 시작 및 종료 시간에 해당 테이블에 간단히 가입하십시오. 액세스에는 여분의 괄호와 파생 테이블이 필요합니다.

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