2012-02-09 61 views
1

我在日曆中分配給具有sdate(ShowDate)和hdate(HideDate)的storeID中的某個事件。現在,對於每個使用此商店ID的新事件,我都需要確保與現有日期無重疊。那有意義嗎?我怎麼做?我閱讀有關的東西,但無法弄清楚如何「只在不重疊時插入」。防止重疊日期範圍的創建

+0

歡迎來到StackOverflow。什麼「日曆」?什麼語言?什麼數據庫?你試過什麼了?您不提供任何信息,我們可以嘗試幫助您。請編輯您的問題並提供更多詳細信息。如果你不這樣做,恐怕這個問題最終會被視爲「不是真正的問題」。 – 2012-02-09 03:54:49

+0

對不起,PHP&MySql - 我試着玩BETWEEN,但還沒有真正得到它,也可以在PHP之間使用? – cerr 2012-02-09 04:00:28

回答

3

一般來說,如果有兩個範圍與S1..E1和S2..E2作爲範圍的起始值和結束值,則具有重疊,如果:

  • S1 < E2和
  • S2 < E1

這是對稱的,這是很好的(和令人放心)。您需要仔細判斷這些「小於」操作是否應該「小於或等於」;兩者都可以合理使用,具體取決於您存儲數據的方式(打開vs關閉vs半開或關閉和關閉打開範圍等)。你可以在'Determine whether two date ranges overlap'的問題上看到diagram的可能性。

在您的上下文中,「ShowDate」對應於開始日期,「HideDate」對應於結束日期。

聽起來好像你也想做'conditional insert'一樣。在這種情況下,假設你的STOREID是1001,showdate相似是2012-03-21而HideDate是2012-03-28,那麼你可能會寫:

INSERT INTO Calendar(StoreID, ShowDate, HideDate, ...) 
    SELECT 1001, '2012-03-21', '2012-03-28', ... 
    FROM Dual 
    WHERE NOT EXISTS(SELECT * FROM Calendar C2 
         WHERE C2.StoreID = 1001 
         AND C2.ShowDate < '2012-03-28' 
         AND '2012-03-21' < C2.HideDate 
        ); 

中SELECT列表中值是你想添加到日曆表。子選擇表示您獲得0行(因爲有重疊)或1行(因爲沒有重疊)與新值的數據。

+0

爲什麼'SELECT ... FROM Dual'而不是元組''(1001,'2012-03-21','2012-03-28',...)'? – Air 2014-01-27 21:23:50

+0

SQL的方言(或DBMS遵循的標準)。一些DBMS不支持該符號。 – 2014-01-27 21:25:17