Как проверить, не совпадают ли даты события с существующим событием

Как проверить, не совпадают ли диапазоны дат? У меня такая есть в модели, продолжает копить.

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

person jaimers    schedule 13.03.2014    source источник
comment
Итак, вам нужно сначала проверить, существует ли данный date, прежде чем вы собираетесь сохранять запись в своей базе данных?   -  person jhnferraris    schedule 13.03.2014
comment
как вы определяете перекрытие?   -  person Stefano Mtangoo    schedule 13.03.2014
comment
возможно это из-за вашего типа переменных   -  person Developerium    schedule 13.03.2014
comment
что вы имеете в виду под перекрытием? между датой начала и окончания или совпадающими записями даты начала и окончания?   -  person Eric Santos    schedule 14.03.2014
comment
Допустим, существует запись 2 / 1-5 / 31. Итак, новый рекорд 1 / 3-4 / 30 перекрывается. 4 / 15-7 / 10 тоже перекрытие   -  person jaimers    schedule 14.03.2014


Ответы (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 - отключение диапазонов дат

person Samuel Liew♦    schedule 14.03.2014