我试图获得过去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的值是什么?
答案 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)