如何防止时间重叠?

时间:2016-01-05 13:50:13

标签: time coldfusion logic

我正在尝试修复用于比较日期,开始和结束时间的cfif语句。因此,我的if语句的第一部分工作正常,我设置逻辑以检查日期是否相等,如果他们要比较数据库中的开始时间与从参数传递的开始时间和结束时间相同。如果我已经拥有:

,我的代码在这种情况下会破坏
Date: 01/31/2016 Start Time: 8:30 AM End Time: 9:50 AM

我尝试传递下三个参数:

Date 01/31/2016 Start Time 10:00 AM End Time: 10:40 AM

因此我的代码应该允许将其保存在数据库中,因为我们没有时隙重叠。但是这个日期和时间应该只允许一次。但是,如果我不断尝试保存这个,我的代码不会阻止它。以下是我使用的逻辑:

<cfif arguments.datepicker EQ qryTable1.DateMeet>
    <cfif ((arguments.StartTime LTE qryTable1.Stime AND arguments.EndTime LTE qryTable1.Stime) OR (arguments.StartTime GTE qryTable1.Etime AND arguments.EndTime GTE qryTable1.Etime))>
       <cfquery name="qryTable1" datasource="test">
           Insert Into Schedule(DateMeet, Stime, Etime)
           Values (<cfqueryparam cfsqltype="cf_sql_date" value="#arguments.datepicker#">,
                   <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.StartTime#">,
                   <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.EndTime#">)
       </cfquery>
    </cfif>  
<cfelse>
    <cfif arguments.datepicker EQ qryTable1.DateMeet>
         <cfquery name="qryTable1" datasource="test">
           Insert Into Schedule(DateMeet, Stime, Etime)
           Values (<cfqueryparam cfsqltype="cf_sql_date" value="#arguments.datepicker#">,
                   <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.StartTime#">,
                   <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.EndTime#">)
        </cfquery>
    </cfif>
</cfif>

如果我选择相同日期的重叠时间,我仍然无法找到为什么我的逻辑会捕获,但如果我选择超出范围的东西并保存一次,则允许我多次执行此操作。如果有人能看出我的逻辑有什么问题,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:4)

我使用线条图来开发逻辑以确保时隙不重叠。共有7个案例需要考虑,但可以减少到2个案例。如果a和b没有重叠,则a的endDateTime小于b的startDateTime,或者a的endDateTime小于b的startDateTime。

所以:

    b         a
|-------| |-------|

    a         b
|-------| |-------|

根据您的要求,&lt;或者&lt; =可以使用。

答案 1 :(得分:1)

这是一种格式化的评论。首先,通过查看数据来解决if / else逻辑问题。从这样的事情开始:

<cfif arguments.datepicker EQ qryTable1.DateMeet>
match
<cfelse>
no match
<cfdump var = "datepicker is #arguments.datepicker# and query is "#qryTable1.DateMeet#">
</cfif>

继续,直到你明白为什么事情发生的方式。

你也有这个:

<cfif ((arguments.StartTime LTE qryTable1.Stime 
AND arguments.EndTime LTE qryTable1.Stime) 
OR (arguments.StartTime GTE qryTable1.Etime 
AND arguments.EndTime GTE qryTable1.Etime))>

   <cfquery name="qryTable1" datasource="test">
       Insert Into Schedule(DateMeet, Stime, Etime)

您正在对名为qryTable1的查询变量执行逻辑,然后运行具有该名称的另一个查询。覆盖该变量可能会导致问题。

仍然使用该变量,没有必要为涉及写入数据的cfquery标记设置name属性。换句话说,这个:

   <cfquery name="qryTable1" datasource="test">
       Insert Into Schedule(DateMeet, Stime, Etime)

可能是这样的:

   <cfquery datasource="test">
       Insert Into Schedule(DateMeet, Stime, Etime)

仍然使用该变量,不清楚它是否是函数的本地变量。它没有范围local,并且您没有显示整个功能。如果它不是本地的,那可能是个问题。

最后,单独比较时间会导致午夜左右的问题。使用datetime(时间戳)变量的额外工作通常是值得的。