0

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

例如:如果我查看 5 月,我会想要 4 月和 3 月的平均值。如果我在看 2 月,我会想要 1 月和 12 月(上一年)的平均值。

我有一个接受用户所在页面的月份和年份的函数(它也接受 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_payout 保存的月份/年份的 INT 值。

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

4

4 回答 4

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')
于 2013-05-22T09:36:50.227 回答
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)
于 2013-05-22T00:43:23.677 回答
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)

于 2013-05-21T22:16:34.627 回答
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

于 2013-05-21T22:14:09.537 回答