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