MySQL/PHP基于可变月份获取过去两个月的平均值


MySQL/PHP get average of past two months based on variable month

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

交货:如果我看五月,我想要四月和三月的平均值。如果我看二月份,我想要(前一年)一月和十二月的平均值。

我有一个函数,它接受用户所在页面的月份和年份(它也接受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_monthplan_year,它们存储了雇员的total_支出保存到哪个月/年份的INT值。

根据$month和$year的值,我如何编写WHERE子句来获取前2个月的AVG ?

我认为更容易读懂的解决方案是:

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

你只需要计算合适的值。

这也是相当可读的:

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

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

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

编辑:误读问题。这将得到最近两个月的平均值。

你可以非常冗长地说where (month and year)或(month and year)

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数据类型只存储月份和年份

我认为最简单的方法是将年/月组合视为从年/月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)