2016-01-05 59 views
1

我試圖修復我用來比較日期,開始和結束時間的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> 

我仍然無法找到爲什麼我的邏輯捕捉如果我選擇在同一日期重疊時間,但如果我撿的東西是超出範圍和保存一次,讓我多次這樣做。如果有人能看出我的邏輯有什麼問題,請告訴我。謝謝。

回答

4

我使用線條圖來開發邏輯以確保時隙不重疊。共有7個案件需要考慮,但可以減少到2個。如果a和b不重疊,則a的endDateTime小於b的startDateTime,或者a的endDateTime小於b的startDateTime。

因此,要麼:

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

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

根據您的需求,無論是<或< =都可以使用。

+0

很好的解釋。雖然對於第二部分,你的意思是寫「endDateTime * b *小於* a *的startDateTime」嗎? – Leigh

+0

@ user3023588 - 請記住CF是多線程的,所以使用你當前的方法有一點競爭條件的機會。考慮在SQL中執行邏輯,只有插入操作不會有重疊。使用「結果」屬性檢查受影響記錄的數量。如果它是'> 0',你知道插入是成功的。否則,它失敗了,你可以忽略它或採取其他一些行動,如拋出一個錯誤。 – Leigh

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標記的名稱屬性。換句話說,這樣的:

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

可能是這樣的:

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

不過,目前尚不清楚,這是本地的功能。它沒有作用域local,並且你沒有顯示整個功能。如果它不是本地的,那可能是一個問題。

最後,比較孤立的時間可能導致午夜左右出現問題。使用datetime(timestamp)變量的額外努力通常是值得的。

+0

*不需要爲涉及寫入數據的cfquery標籤設置名稱屬性*爲了說明,只有'select'語句返回結果集。當與「insert/update/delete」一起使用時,查詢變量將是未定義的。 – Leigh