mysql – 防止创建重叠的日期范围

我在分配给具有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行(因为没有重叠)与新值的数据.

上一篇:[LeetCode] 835. Image Overlap


下一篇:MVVM:在具有导航视图的视图寻呼机中出现片段重叠问题?