我们正在使用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;'
)
));
?>
此小部件需要用于搜索从上述小部件中指定的值起具有可用性_开始日期+/-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子句以选择小部件的值与availability_start_date值相差+/-2天的记录?
更新:我修改了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天内,您将希望使用DATEDIFF()
返回的绝对值ABS()
,请验证它是否为<= 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']
);
}