【问题标题】:Prevent creation of overlapping date ranges防止创建重叠的日期范围
【发布时间】:2012-02-09 03:45:35
【问题描述】:

我在日历中分配了一个特定事件,该事件分配给一个 storeID,该 storeID 具有一个 sdate (ShowDate) 和一个 hdate (HideDate)。现在,对于具有此 storeID 的每个新事件,我需要确保与现有日期期间没有重叠。那有意义吗?我怎么做?我阅读了一些东西,但不知道如何“仅在不重叠的情况下插入”。

【问题讨论】:

  • 欢迎来到 StackOverflow。什么“日历”?什么语言?什么数据库?你试过什么了?您在这里没有提供任何我们可以用来帮助您的信息。请编辑您的问题并提供更多详细信息。恐怕如果你不这样做,这个问题最终会作为“不是一个真正的问题”而被关闭。
  • 抱歉,PHP 和 MySql - 我尝试过使用 BETWEEN,但还没有真正开始,我可以在 php 中使用 between 吗?

标签: mysql date overlap


【解决方案1】:

一般来说,如果您有两个范围,其中 S1..E1 和 S2..E2 作为范围的开始值和结束值,那么如果出现以下情况,则存在重叠:

  • S1
  • S2

这是对称的,这很好(并且令人放心)。您需要仔细决定那些“小于”操作是否应该“小于或等于”;两者都有意义,具体取决于您存储数据的方式(开放、封闭、半开放或开放封闭和封闭开放范围等)。您可以在问题'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', ... )
  • SQL 方言(或 DBMS 遵循的标准)。一些 DBMS 不支持这种表示法。
猜你喜欢
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多