3

我们正在使用 Yii 框架并创建了一个搜索表单以包含以下 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 天的availability_start_date 的用户。

我们的 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 子句中的逻辑只要求匹配可用性开始日期大于或等于小部件的值。

如何修改上述 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)';
                }

不幸的是,当我测试逻辑时,返回的记录不符合此条件。在表单或页面上不会引发错误。

4

4 回答 4

6

DATEDIFF()返回以天为单位的值。ABS()对于 +/- 2 天,您将需要使用 的返回的绝对值DATEDIFF(),验证它是否为<= 2

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

我还将参数包装到DATEDIFF()inDATE()以截断时间部分(如果存在)。如果您的应用程序不需要它们,请删除它们。

于 2012-08-02T18:16:48.403 回答
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)";
于 2012-08-02T18:16:59.150 回答
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)
于 2012-08-02T18:15:22.117 回答
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']
    );
}
于 2012-08-02T18:19:50.083 回答