【问题标题】:How to check if event dates are not overlapping an existing event如何检查活动日期是否与现有活动不重叠
【发布时间】:2014-03-13 12:43:59
【问题描述】:

如何检查日期范围是否重叠?我的模型中有这个,它一直在保存。

public function dateRangeExists($attribute, $params) {
    $criteria = new CDbCriteria;

    $criteria->compare('id_one',$this->id_one,true,);
    $criteria->compare('id_two',$this->id_two,true,'OR');
    // $criteria->addCondition('start_date < '.$this->start_date);
    // $criteria->addCondition('end_date > '.$this->end_date);

    $criteria->addBetweenCondition('start_date', $this->start_date, $this->end_date);
    $criteria->addBetweenCondition('end_date', $this->start_date,$this->end_date);

    $record = self::model()->exists($criteria); 

    if(!empty($record)) {
         $this->addError('id', 'Item already exists within range.');
         return false;
    }
}

【问题讨论】:

  • 所以您需要先检查给定的date 是否已经存在,然后再将条目保存到数据库中?
  • 如何定义重叠?
  • 可能是因为你的变量类型
  • 重叠是什么意思?它是在开始日期和结束日期之间还是重叠的开始日期和结束日期条目之间?
  • 假设存在 2/1-5/31 的记录。因此,重叠了 1/3-4/30 的新记录。 4/15-7/10 也是重叠的

标签: php sql yii criteria date-range


【解决方案1】:

事件重叠有 3 种可能的情况:

  1. 在当前事件之前开始的事件(结束日期在当前事件开始日期之后)

  2. 一个事件在当前事件进行时开始(开始日期在当前事件结束日期之前)

  3. 事件在当前事件期间开始和结束(可以忽略,因为上述任一规则仍然适用)

如上所述,您需要做的是检查是否存在结束日期在当前开始日期(#1)之后的现有事件,或者开始日期在当前结束日期之前(#2)的条件。注意关键字OR的使用:

WHERE (start_date < $this->start_date AND end_date > $this->start_date)
OR (start_date < $this->end_date AND end_date > $this->end_date)

要将其应用于 Yii 上下文,我会这样做:

$criteria = new CDbCriteria;
$criteria->addCondition(
    "WHERE (end_date > '{$this->start_date}' OR start_date < '{$this->end_date}')".
    "OR (start_date < '{$this->end_date}' AND end_date > '{$this->end_date}')"
);

我还会在客户端另外使用可视日历来阻止已经有事件的日期,以避免用户选择这些日期。

如果您使用的是 jQueryUI,这里有一个现有的解决方案:jquery UI datepicker - disabling date ranges

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2023-04-09
    • 2019-03-12
    相关资源
    最近更新 更多