【问题标题】:Displaying CFQuery Result Over Time Span随时间跨度显示 CFQuery 结果
【发布时间】:2014-12-20 06:27:55
【问题描述】:

我能够在 1 小时的时间跨度内获得查询 - 以 15 分钟为增量...

我只是想在主键相同时停止显示重复的结果。

ie:如果某件事从早上 6:45 开始 - 并在早上 8:00 结束 - 如果主键(masterid)相同,我只希望它跨越 DIV 一次。然后,如果早上 8 点有其他事情,使用不同的主键 - 跨越该 div 时间框架等......

我正在考虑使用 cfloop 之类的 - 检查 mastered 是否相同或不同/

关于如何做到这一点的想法......

查询代码工作正常 - 我的显示代码也是如此...包含图片以了解我正在尝试做什么。

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

【问题讨论】:

  • 您使用 CF 执行任务的任何特殊原因?你没有说你正在使用哪个 dbms,但是像 SQL Server 这样的数据库使这种任务变得容易得多。无需在循环中查询。
  • 网站全部内置于 ColdFusion - 数据库集成使用 Access
  • 作为不是为多线程 Web 应用程序设计的桌面数据库,Access 确实限制了您的选择。如果可能,请升级到 SQL Server。它更加灵活,并且快速版本是免费的。话虽如此,您仍然可以通过一个包含时间的辅助表来简化它,以 15 分钟为增量。只需在开始/结束时间将您的其他表加入其中。生成的查询将包含您需要的所有间隔。然后根据需要格式化查询输出。 (编辑)在 CTE 单独出现之前,我在 SQL Server 中使用过类似的方法。

标签: coldfusion coldfusion-9 cfml


【解决方案1】:

如 cmets 中所述,作为桌面数据库,MS Access 相当有限。 SQL Server 等企业数据库为此类任务提供了更强大的功能,例如using CTE's

但是,为了提供另一个视角,您也可以使用辅助时间表来代替。 (在 CTE 出现之前,这是 SQL Server 中的一种常见方法)。您可以使用Mark's loop 作为基础,轻松地在00:0023:45 之间以十五分钟的增量填充表格。然后只需在预定的开始和结束时间加入该表即可。 (访问需要额外的括号和派生表)。

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 个结果并适当地调整 div 的大小。所以我没有遇到上面的例子......
  • 是的,但是使用 50 多个查询 - 每个请求 - 这样做效率极低。如果应用程序有多个用户,这将是一个瓶颈。运行单个查询要高效得多。然后使用数据来确定约会跨越多少间隔。例如,一个简单的 dateDiff("n") / 15 应该告诉你。
  • Lost Leigh - 因为我有一个打开和关闭时间 - 并将其分成 15 分钟的间隔 - 并在间隔中查询是否有预订...我遇到的问题是说 4 个间隔(1 小时)的跨度 - 并显示 4 个东西而不是 1 个......所以这是排序的 - 但你已经达到了我对降低速度的好奇心。不用太担心,因为这只发生在管理区域......也许我以后会玩你的代码......谢谢
  • 嗯,你没有理由不能将 Dan 的建议与上面的查询结合起来,并使用它来确定循环何时开始新约会。然后使用int(dateDiff("n", StartTime, EndTime)/15) 之类的方法简单地计算间隔数,即4。逻辑的确切顺序实际上取决于您当前的 html/css。没有看到代码很难更具体。
【解决方案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>

请记住,对于短迭代来说,这是一个不错的解决方案。如果进行长时间迭代,我会将“步骤”属性设置为变量,而不是直接调用函数。如果 真的 长我可能会选择别的东西。但是对于几天的增量,我认为它会很好地工作。请参阅Interesting loop for date and time 上的这篇文章。祝你好运!

【讨论】:

  • 阅读了链接的文章后,我最初的印象是使用变量而不是每次循环运行 createTimespan() 应该可以解决上述性能问题。
【解决方案3】:

我通常在开始循环之前放一个垃圾值。

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

【讨论】:

  • 这是正确的方法 - 我刚刚为时间填充进行了另一个循环 - 我将垃圾值放在我的另一个循环之外。谢谢。感谢您对其他东西的洞察力 - 但 Cold Fusion/Access 无需构建/拉取所需的时间。
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2021-07-28
相关资源
最近更新 更多