Я пытаюсь найти временные совпадения конкретного пользователя, я думаю, что моя логика поймает все круги, но это улавливает, только если начало ИЛИ конец находится между временным фреймом, но ничего не найдено, если оба они начинаются и заканчиваются между некоторые периоды записи!
$tempModel = clone $this; // clone model $criteria->addCondition(' ( t.user = :user AND (t.startDate >= :start AND t.startDate <= :end )) OR ( t.user = :user AND (t.endDate >= :start AND t.endDate <= :end )) '); $criteria->params = array( ':start' => date('Ym-d', strtotime($tempModel->startDate)), ':end' => date('Ym-d', strtotime($tempModel->endDate)), ':user ' => $tempModel->userID , ); if(!empty($tempModel->idUserTime)) // dont find updated record $criteria->addCondition('t.idUserTime != ' . $tempModel->idUserTime); $criteria->addCondition('t.active = 1'); // if this is an active user time $hasRecord = Usertime::model()->findAll($criteria);
В чем проблема?
Две даты перекрываются, если хотя бы одна из границ каждой из них находится между границами другого:
... WHERE some_other_conditions AND ( date1.start BETWEEN date2.start AND date2.end OR date1.end BETWEEN date2.start AND date2.end OR date2.start BETWEEN date1.start AND date1.end OR date2.end BETWEEN date1.start AND date1.end )