Where子句中的MySQL DateDiff?

时间:2012-08-02 18:11:21

标签: php mysql yii

我们正在使用Yii Framework并创建了一个搜索表单以包含以下DatePicker widge:

<?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子句以选择窗口小部件的值与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 个答案:

答案 0 :(得分:6)

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

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

我还在[{1}}中将参数包装到DATEDIFF()以截断时间部分(如果它们存在)。如果您的申请不需要,请删除它们。

答案 1 :(得分: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)";

答案 2 :(得分: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)

答案 3 :(得分: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']
    );
}