如何防止时间重叠?

How to prevent time overlap?

我正在尝试修复我用来比较日期、开始和结束时间的 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>

如果我为同一日期选择重叠时间,我仍然无法找到为什么我的逻辑会出错,但如果我选择超出范围的内容并保存一次,我可以多次这样做。如果有人能看出我的逻辑有什么问题,请告诉我。谢谢你。

这是一条格式化的评论。首先,通过查看您的数据解决 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 并且您没有显示整个功能。如果不是本地的,那可能是个问题。

最后,孤立地比较时间可能会导致午夜前后出现问题。使用日期时间(时间戳)变量的额外努力通常是值得的。

我用画线的方式来开发逻辑,保证时隙不重叠。总共要考虑 7 种情况,但可以减少到 2 种情况。如果a和b不重叠,则a的endDateTime小于b的startDateTime,或者a的endDateTime小于b的startDateTime。

所以要么:

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

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

根据您的要求,可以使用 < 或 <=。