我在日曆中分配給具有sdate
(ShowDate)和hdate
(HideDate)的storeID中的某個事件。現在,對於每個使用此商店ID的新事件,我都需要確保與現有日期無重疊。那有意義嗎?我怎麼做?我閱讀有關的東西,但無法弄清楚如何「只在不重疊時插入」。防止重疊日期範圍的創建
回答
一般來說,如果有兩個範圍與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行(因爲沒有重疊)與新值的數據。
爲什麼'SELECT ... FROM Dual'而不是元組''(1001,'2012-03-21','2012-03-28',...)'? – Air 2014-01-27 21:23:50
SQL的方言(或DBMS遵循的標準)。一些DBMS不支持該符號。 – 2014-01-27 21:25:17
- 1. Django的 - 防止日期範圍重疊
- 2. 防止重疊日期範圍的表級約束
- 3. 重疊日期的範圍
- 4. SQL重疊日期範圍
- 5. 防止日期重疊postgresql
- 6. 與其他日期範圍重疊的日期範圍
- 7. 查詢2字段日期範圍重疊日期範圍
- 8. 塔防:重疊塔範圍
- 9. 創建日期範圍
- 10. 創建mysql日期範圍
- 11. 創建日期範圍表
- 12. 如何查詢重疊日期範圍?
- 13. Javascript日期範圍與月重疊
- 14. Mongoid和Rails重疊日期範圍
- 15. SQL Server找到重疊日期範圍
- 16. 從重疊的日期範圍獲取連續的日期範圍
- 17. 摺疊日期範圍
- 18. 要看看日期範圍重疊SQL日期的另一個範圍
- 19. 排除日期/時間範圍與重疊的日期/時間範圍
- 20. PHP:選擇重疊的日期時間範圍與時間範圍重疊的日期
- 21. 重疊比較日期範圍,但允許相鄰範圍
- 22. 選擇與某個日期重疊的日期範圍
- 23. MongoDB - 檢查日期範圍A是否與其他日期範圍重疊b
- 24. MySQL檢查日期範圍是否與其他日期範圍重疊?
- 25. 使用自定義日期範圍存儲重疊日期範圍
- 26. 防止重疊的開始日期和結束日期php
- 27. 重疊日期範圍 - 僅識別重疊
- 28. 在VB.NET重疊日期範圍內計算日期
- 29. 在SELECT上創建日曆日期範圍的重複記錄
- 30. 問題的日期範圍內創建
歡迎來到StackOverflow。什麼「日曆」?什麼語言?什麼數據庫?你試過什麼了?您不提供任何信息,我們可以嘗試幫助您。請編輯您的問題並提供更多詳細信息。如果你不這樣做,恐怕這個問題最終會被視爲「不是真正的問題」。 – 2012-02-09 03:54:49
對不起,PHP&MySql - 我試着玩BETWEEN,但還沒有真正得到它,也可以在PHP之間使用? – cerr 2012-02-09 04:00:28