2012-08-02 136 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'] 
    ); 
}