防止创建重叠的日期范围

std*_*err 3 mysql date overlap

我在分配给具有sdate(ShowDate)和hdate(HideDate)的storeID的日历中有一个特定事件.现在对于具有此storeID的每个新事件,我需要确保与现有日期周期没有重叠.那有意义吗?我怎么做?我读了一些东西,但无法弄清楚如何"仅在不重叠时插入".

Jon*_*ler 5

通常,如果您有两个范围,其中S1..E1和S2..E2作为范围的起始值和结束值,则在以下情况下重叠:

  • S1 <E2和
  • S2 <E1

这是对称的,这是好的(并且令人放心).您需要仔细决定那些"少于"的操作是否应该"小于或等于"; 两者都可以有意义,具体取决于您存储数据的方式(开放与封闭对比半开放或开放封闭和封闭开放范围等).您可以在"确定两个日期范围是否重叠"的问题上看到可能性的图表.

在您的上下文中,'ShowDate'对应于开始日期,'HideDate'对应于结束日期.

听起来好像你也想做一个'条件插入'.在这种情况下,假设您的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
                    );
Run Code Online (Sandbox Code Playgroud)

SELECT列表中的值是您要添加到Calendar表的值.子选择意味着您获得0行(因为存在重叠)或1行(因为没有重叠)与新值的数据.