1

我想获取上个月的数据,我正在使用下面的代码来做,但它对我来说不能正常工作:

这是我的代码:

public function getLastMonth($user_id)
{       
    $criteria=new CDbCriteria;

    $criteria->condition = 'leave_from_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)';
    $criteria->condition = 'leave_to_date <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)';
    $criteria->condition = "user_id = $user_id";
    $data = Leaves::model()->findAll($criteria);
    $lastMonthR = 0;
    foreach($data as $lastMonth)
     {
         $lastMonthR += $lastMonth->total_leaves_hours;
     }      
    //return lastMonthR CHtml::encode($lastMonthR);
    return $lastMonthR;
}

我想获得与 MYSQL 中以下查询的结果等效的结果:

SELECT *,sum(total_leaves_hours) FROM tbl_leaves
WHERE leave_from_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND 
leave_to_date <= DATE_SUB(CURDATE(), INTERVAL 1 DAY) ;

当我运行 YII 的代码(如上所示)时,它显示了表的所有数据,请帮助我,我是 YII 的新手。提前致谢。

4

2 回答 2

0

当您第二次分配一个值condition时,您会覆盖第一个条件。将两者结合为一个条件。您还应该使用准备好的语句而不是字符串插值:

$criteria->condition = 'leave_from_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
      AND leave_to_date <= DATE_SUB(CURDATE(), INTERVAL 1 DAY
      AND user_id = :id';

$data = Leaves::model()->findAll($criteria, array (':id'=>$user_id));
于 2013-08-02T06:14:13.510 回答
0

你写$criteria->condition = ...了三遍。这会分配最后一个值并丢弃其余值。Joni 的回答给出了一个简单的解决方案。

但是,在仔细查看您的逻辑之后SUM如果您不使用查询中的任何其他数据,它实际上可以替换为更简单的查询。您提供的示例查询选择了更多数据,但您编写的函数没有使用它 - 不清楚您是否真的需要记录本身。

public function getLastMonth($user_id) {
    $cmd = Yii::app()->db->createCommand()
      ->select('SUM(total_leaves_hours)')
      ->from(Leaves::model()->tableName())
      ->andWhere('leave_from_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)')
      ->andWhere('leave_to_date <= DATE_SUB(CURDATE(), INTERVAL 1 DAY)')
      ->andWhere('user_id = :user_id', array(
        ':user_id' => $user_id,
      ))
    ;

    return $cmd->queryScalar();
}
于 2013-08-02T06:19:50.110 回答