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

このウィジェットを使用して、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

4 に答える 4

6

DATEDIFF()日単位の値を返します。+/- 2日間は、ABS()によって返される絶対値を使用する必要があります。それが。DATEDIFF()であることを確認して<= 2ください。

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

また、時間部分が存在する場合はそれらを切り捨てるために、引数をDATEDIFF()inにラップしました。DATE()アプリケーションに不要な場合は削除してください。

于 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 に答える