MySQL DateDiff в разделе Where?

Мы используем Yii Framework и создали форму поиска, чтобы включить следующий виджет DatePicker:

<?php echo $form->labelEx($model, 'availability_start_date');?> <?php Yii::import('zii.widgets.jui.CJuiDatePicker'); $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'name'=>'stattDate', 'options'=>array( 'showAnim'=>'fold', ), 'htmlOptions'=>array( 'style'=>'height:20px;' ) )); ?> 

Этот виджет должен использоваться для поиска пользователей, у которых есть доступность_start_date +/- 2 дня от значения, указанного в приведенном выше виджетах.

Наш UserController имеет следующую логику соединения:

 if ($search_frm['availability_start_date']){ $join .= ' LEFT JOIN user_availability_start_date usd on u.id = usd.id'; $where .= 'AND usd.availability_start_date >= '.$search_frm ['availability_start_date']; } 

В настоящее время логика в предложении WHERE просто запрашивает совпадение, когда значение доступности_start_date больше или равно значению виджета.

Как изменить приведенное выше предложение WHERE, чтобы выбрать те записи, где значение виджета составляет +/- 2 дня, отличное от значения доступности_start_date?

ОБНОВЛЕНИЕ: я пересмотрел предложение where, чтобы читать следующее:

 if ($search_frm['availability_start_date']){ $join .= ' LEFT JOIN user_availability_start_date usd on u.id = usd.id'; $where .= ' AND usd.availability_start_date >= DATE_ADD('.$search_frm.', INTERVAL -2 DAY) AND usd.availability_start_date <= DATE_ADD(' .$search_frm.', INTERVAL 2 DAY)'; } 

К сожалению, когда я проверяю логику, возвращаются записи, которые не соответствуют этим критериям. На форму или страницу нет ошибок.

DATEDIFF() возвращает значение в днях. В течение +/- 2 дней вы захотите использовать абсолютное значение ABS() возвращаемое DATEDIFF() , убедитесь, что оно равно <= 2 .

 $where .= "AND ABS(DATEDIFF(DATE(usd.availability_start_date), DATE('" . $search_frm['availability_start_date'] . "'))) <= 2"; 

Я также завернул аргументы в DATEDIFF() в DATE() чтобы урезать части времени, если они присутствуют. Удалите их, если они не нужны для вашего приложения.

BETWEEN сделаем это для вас.

 "AND usd.availability_start_date BETWEEN DATE_ADD('". $search_frm['availability_start_date'] ."', INTERVAL - 2 DAY) AND DATE_ADD('". $search_frm['availability_start_date'] ."', INTERVAL 2 DAY)"; 
 AND usd.availability_start_date >= DATE_ADD('.$search_frm .', INTERVAL -2 DAY) AND usd.availability_start_date <= DATE_ADD('.$search_frm .', INTERVAL 2 DAY) 

Попробуй это:

 if ($search_frm['availability_start_date']) { $join .= ' LEFT JOIN user_availability_start_date usd on u.id = usd.id'; $where .= sprintf( 'AND %s BETWEEN (usd.availability_start_date - INTERVAL 2 DAY) ' . ' AND (usd.availability_start_date + INTERVAL 2 DAY)', $search_frm['availability_start_date'] ); }