2012-08-02 64 views
3

我們正在使用Yii框架並創建了一個搜索表單包括以下的DatePicker widge:MySQL的DateDiff在Where子句中?

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

這個小部件需要被用於搜索誰擁有availability_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子句只是要求進行匹配,其中availability_start_date大於或等於該控件的值。

如何修改上述WHERE子句以選擇widget的值爲+/- 2天而不是availability_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)'; 
       } 

不幸的是,當我測試的邏輯,將返回的記錄不符合這一標準。在表單或頁面上不會出現錯誤。

回答

6

DATEDIFF()以天爲單位返回一個值。對於+/- 2天,您將希望使用由DATEDIFF()返回的絕對值ABS(),驗證它是<= 2

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

我還包裹的參數DATEDIFF()DATE()如果它們存在截斷關閉的時間的部分。如果您的應用程序不必要,請將其刪除。

+0

+1的風采吧! – Matt 2012-08-02 18:19:57

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