2016-01-15 159 views
0

我正在進行項目,我必須防止在同一日期的時間重疊。用戶必須選擇選擇日期,下落日期,選擇時間和下降時間。我的邏輯工作正常,並防止時間重疊,但我試圖找出如何讓我可以讓用戶選擇相同的日期,然後比較時間。這裏是我的HTML代碼:如何防止同一日期的時間重疊?

<tr> 
    <td> 
    <label>Pick up Date</label> 
    <input name="DateFrom" id="DateFrom" type="text" size="10" maxlength="10" value=""> 
    <label>Pick up Time</label> 
    <input name="TimeFrom" id="TimeFrom" type="text" size="10" maxlength="10" value=""> 
    </td> 
</tr> 

<tr> 
    <td> 
    <label>Drop off Date</label> 
    <input name="DateTo" id="DateTo" type="text" size="10" maxlength="10" value=""> 
    <label>Drop off Time</label> 
    <input name="TimeTo" id="TimeTo" type="text" size="10" maxlength="10" value=""> 
    </td> 
</tr> 

,這裏是我的邏輯與傳遞的參數:

<cfargument name="DateFrom" type="string" required="yes"> 
<cfargument name="DateTo" type="string" required="yes"> 
<cfargument name="TimeFrom" type="string" required="yes"> 
<cfargument name="TimeTo" type="string" required="yes"> 

<cfquery name="qryTest"> 
    Select PickDate,DropDate,PickTime,DropTime 
    From ptReservation 
    Order by PickDate 
</cfquery> 

<cfif (arguments.TimeTo LT qryTest.PickTime OR qryTest.DropTime LT arguments.TimeFrom)> 
    <cfquery name="addReservation" datasource="testData"> 
     //Do insert 
    </cfquery> 
</cfif> 

因此,例如,我的代碼將防止和時間重疊,但如果時間是不是在同一天。如何查看日期是否匹配,然後檢查時間重疊?如果有人可以幫助,請讓我知道。

+0

一個很好的起點是在文檔中使用Category by Category視圖。具體而言,[日期功能](http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec1a60c-7ffc.html#WSc3ff6d0ea77859461172e0811cbec22c24-6986)。有幾個可以用來比較日期。 RE:' Leigh

+1

如果我正確地假設拾取日期出現拾取時間(並且丟棄時間出現在下落日期),那麼在比較拾取和丟棄之前,你應該將每次與它的日期相結合。 –

+0

qryTest從哪裏來? –

回答

2

坦率地說,將日期和時間存儲在不同的列中使得這項任務比需要成爲IMO更困難。在預訂系統中,兩者是完全相關的。將它們分開只會使執行常見任務變得困難,比如檢查衝突或重疊(最近的線程支持)。除非有充分的理由,否則他們必須保持分開,否則我會建議對錶格進行重組,並將保留日期和時間存儲在單列中。

例如具有這樣的結構,你可以很容易地檢查衝突的保留在一個單一的查詢,甚至那些跨越多天:

Reservation table structure Reservation table data

當添加一個新的記錄,使用EXISTS條款只插入時沒有衝突的預訂找到記錄:

<!--- example of reservation date/time to check ---> 
    <cfset requestedStartDateTime = createDateTime(2016, 1, 14, 14, 0, 0)> 
    <cfset requestedEndDateTime = createDateTime(2016, 1, 15, 16, 0, 0)> 
    ... 

    <cfquery result="yourResult" ....> 
    INSERT INTO Reservation (startDateTime, endDateTime, ....) 
    SELECT <cfqueryparam value="#requestedStartDateTime#" cfsqltype="cf_sql_timestamp"> 
      , <cfqueryparam value="#requestedEndDateTime#" cfsqltype="cf_sql_timestamp"> 
      , .... 
    WHERE NOT EXISTS 
      (
      <!--- existing reservation that would overlap ---> 
      SELECT reservationID 
      FROM reservation 
      WHERE startDateTime < <cfqueryparam value="#requestedEndDateTime#" cfsqltype="cf_sql_timestamp"> 
      AND  endDateTime > <cfqueryparam value="#requestedStartDateTime#" cfsqltype="cf_sql_timestamp"> 
     ) 
    </cfquery> 

可以通過檢查CFQUERY決定結果的result屬性。如果result.recordcount> 0,則插入新預留。否則,你知道發現了衝突並可以採取相應的行動。使用CF9/11和MySQL5.6進行測試。

CFQuery Result Structure

<cfif yourResult.recordCount gt 0> 
     SUCCESS: New reservation added 
    <cfelse> 
     ERROR: Conflict detected. INSERT failed. 
    </cfif> 

更新:如果表中包含某種形式的自動遞增列,另一種選擇是使用新的ID返回值as part of the "result" structure。如果存在,則插入成功。否則,它失敗。注意,在像CF9這樣的舊版本中,ID鍵名是數據庫特定的,即MySQL - "generated_key"。從CF10 +起,您可以使用通用密鑰名稱generatedKey

<!--- ID was generated ---> 
    <cfif structKeyExists(yourResult, "generated_key")> 
     SUCCESS: New reservation added 
    <cfelse> 
     ERROR: Conflict detected. INSERT failed. 
    </cfif> 

如果你絕對不能更改表結構,另一種可能性是創建一個VIEWCOMPUTED COLUMN(如果你的數據庫支持的話)包含在單個列組合的日期和時間。這至少可以簡化查詢這兩個值,並允許您使用上述技術來解決您的問題。但是,雖然它可以簡化SQL,但它們並不總是SARGable。所以對於大型數據集,它們可能無法像單個索引列那樣執行。

+0

這對我來說很有用,比用cfif檢查所有內容更方便,同時也保存日期和時間。我有一個問題,甚至在運行Insert之前保護cfquery的最佳方法是什麼?應該是isDefined或structKeyExist?再次感謝您。 –

+1

通常,'structKeyExists'是首選,因爲它更精確,但在許多情況下,淨效果是相同的。請記住這兩個函數驗證變量是否存在,這與* empty *不同。例如,表單字段可能爲空,但仍然存在於操作頁面上。 – Leigh

+0

我通常使用structKeyExist。我測試了這個邏輯,我們必須檢查recordcount,但這對我不起作用。記錄沒有插入表格中,但消息始終指示插入記錄。我不確定那個代碼有什麼問題? –