2014-03-13 28 views
1

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

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; 
    } 
} 
+0

所以,你首先需要检查,如果给定'date'已经存在,你要保存在数据库中的条目之前? – Jhn

+0

你如何定义重叠? –

+0

也许这是因为你的变量类型 – tinybyte

回答

1

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

  1. 的事件当前事件之前开始(结束日期是当前事件的开始日期之后)
    enter image description here

  2. 的事件在当前事件正在进行时开始(开始日期在当前事件结束日期之前)
    enter image description here

  3. 事件开始和当前活动期间(可以被忽略,因为无论是规则上面仍然适用)
    enter image description here

如上所述,你需要做的有一个条件,以检查是否有什么结束存在结束日期在当前开始日期(#1)之后,OR开始日期在当前结束日期(#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

相关问题