我在分配给具有sdate
(ShowDate)和hdate
(HideDate)的storeID的日历中有某个事件。现在对于具有此storeID的每个新事件,我需要确保与现有日期周期没有重叠。那有意义吗?我怎么做?我读了一些东西,但无法弄清楚如何“仅在不重叠的情况下插入”。
答案 0 :(得分:5)
通常,如果您有两个范围,其中S1..E1和S2..E2作为范围的起始值和结束值,则在以下情况下会出现重叠:
这是对称的,这是好的(并且令人放心)。您需要仔细决定那些“少于”的操作是否应该“小于或等于”;两者都可以有意义,具体取决于您存储数据的方式(开放与封闭对比半开放或开放封闭和封闭开放范围等)。您可以在问题diagram上看到'Determine whether two date ranges overlap'的可能性。
在您的上下文中,'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列表中的值是您要添加到Calendar表的值。子选择意味着您获得0行(因为存在重叠)或1行(因为没有重叠)与新值的数据。