MySQL / PHP根据变量月份获得过去两个月的平均值

时间:2013-05-21 22:10:01

标签: php mysql

我试图获得过去2个月的平均值,但不是基于CURDATE()/ NOW()。这将取决于用户在应用程序中查看的月份:

例: 如果我在看五月,我会想要4月和3月的平均值。 如果我在看二月,我会想要一月和十二月(上一年)的平均值。

我有一个函数接受用户所在页面的月份和年份(它也接受emp_id,但这与此问题无关)。

public function getProtectedAmt($month,$year,$id){
$query = "SELECT avg(total_payout) as avg_payout FROM saved_plan_data WHERE emp_id = '$id' AND //this is where i dont know what to query for";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row['avg_payout'];
}

saved_plan_data 表格中,有 plan_month plan_year 字段,用于存储员工的total_payout保存的月/年的INT值

如何编写我的WHERE子句以获取前2个月的AVG,具体取决于$ month和$ year的值是什么?

4 个答案:

答案 0 :(得分:1)

我认为这个解决方案更容易,更易读:

SELECT ...
FROM ...
WHERE
    (plan_year, plan_month) IN ((2012, 12), (2013, 1))

您只需要计算适当的值。

这也很可读:

WHERE CONCAT_WS('-', plan_year, plan_month) IN ('2012-12', '2013-01')

答案 1 :(得分:0)

编辑:误读了这个问题。这样可以得到过去两个月的平均值。

你可能非常详细地说(月和年)或(月和年)

SELECT avg(total_payout) as avg_payout
FROM saved_plan_data
WHERE emp_id=$id
    AND (
        (plan_month = $month1 AND plan_year = $year1)
        OR (plan_month = $month2 AND plan_year = $year2)
    )

或者您可以将plan_month和plan_year作为日期投射并检查该值是否在两个日期之间:

SELECT avg(total_payout) as avg_payout
FROM saved_plan_data
WHERE emp_id=$id
    AND STR_TO_DATE(CONCAT_WS('-',plan_year,plan_month,'1'),'%Y-%m-%d')
        BETWEEN '$year1-$month1-1' AND '$year2-$month2-1'

另外,你真的应该把月份和年份存储在一起。这是一个很好的答案的问题:mysql datatype to store month and year only

答案 2 :(得分:0)

在函数中,创建两个变量$ q_month& $ q_year。

将这些设置为逗号分隔过去两个月。例如。如果当前日期是2013年5月22日,请将值设置为$ q_month = 4,3和$ q_year = 2013 在查询中将这些变量用作WHERE Month in ($q_month) and Year in ($q_year)

答案 3 :(得分:0)

我认为最简单的方法是将年/月组合视为自年/月0以来的月数。也就是说,通过将年份乘以12并将月份相乘来转换为月数。

然后前两个月很简单,你不必担心年界:

SELECT avg(total_payout) as avg_payout
FROM saved_plan_data
WHERE emp_id = '$id' AND
      plan_year*12 + plan_month in ($year*12+month - 1, $year*12+month - 2)