如何防止时间重叠?
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
|-------| |-------|
根据您的要求,可以使用 < 或 <=。
我正在尝试修复我用来比较日期、开始和结束时间的 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
|-------| |-------|
根据您的要求,可以使用 < 或 <=。