2012-08-02 10 views
3

우리는 다음과 같은 DatePicker에서의 widge를 포함하는 검색 양식을 YII 프레임 워크를 사용하고 만들었습니다Where 절에있는 MySQL DateDiff?

이 위젯은 +/- 이일 지정된 값에서 availability_start_date가 사용자를 검색하는 데 사용되어야합니다
<?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;' 
      ) 
     )); 
     ?> 

위 위젯에서.

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

절 그냥 availability_start_date 위젯의 값보다 크거나 같은 경기를 묻는에 현재 논리 :

우리 UserController 조인 다음과 같은 논리를 가지고있다.

위의 WHERE 절을 수정하여 위젯의 값이 availability_start_date 값과 +/- 2 일 차이가 나는 레코드를 선택하려면 어떻게해야합니까?

업데이트 : 나는 다음과 같이 할 수있는 곳에 절을 개정했습니다

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

내가 논리를 테스트 할 때 불행하게도, 기록이 기준을 충족하지 않는 반환됩니다. 폼이나 페이지에 오류가 발생하지 않습니다.

답변

6

DATEDIFF()은 일 단위로 값을 반환합니다. +/- 2 일 동안 ABS()DATEDIFF()에 의해 반환 된 절대 값을 사용하려면 <= 2인지 확인하십시오.

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

나는 또한이있는 경우 시간 부분을 잘라내는 DATE()DATEDIFF()에 인수를 감쌌다. 응용 프로그램에 불필요한 경우 제거하십시오.

+0

하나! – Matt

0
AND usd.availability_start_date >= DATE_ADD('.$search_frm .', INTERVAL -2 DAY) 
AND usd.availability_start_date <= DATE_ADD('.$search_frm .', INTERVAL 2 DAY) 
1

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)"; 
0

이 시도 : 우아함

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'] 
    ); 
}