【问题标题】:MySQL/PHP get average of past two months based on variable monthMySQL/PHP 根据可变月份获取过去两个月的平均值
【发布时间】:2013-05-21 22:10:01
【问题描述】:

我试图获得过去 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 值.

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

【问题讨论】:

    标签: php mysql


    【解决方案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')
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,但如果当前月份是 2 月,过去两个月是(上一年的)1 月和 12 月,这将不起作用 - 因为年份会有所不同。
      • 因此,如果是 2 月,请获取 1,122013,2012 的平均值,这将获取 2013 年和 2012 年 1 月和 12 月的平均值。
      • 好吧,你只需要改变条件。动态生成查询。例如。在这种情况下,它将是 WHERE (MONTH = 'JAN' AND YEAR ='2013') OR (Month = 'DEC' AND YEAR = '2012')。
      • WHERE (月, 年) IN ((12, 2012), (1, 2013))
      • 我已经好几年没用过MySql了。不确定该语法。但看起来是件好事。
      【解决方案3】:

      编辑:误读问题。这将使您获得过去两个月的平均值。

      您可以非常冗长地说明在哪里(月份和年份)或(月份和年份)

      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 个月的平均值。
      • 该查询如何仅限于过去两个月?
      • 糟糕,我将其解读为“我需要过去 2 个月的每个月的平均值。”我知道我没有限制它,但这仍然会给出每个月的平均值。
      • 不幸的是,这并不能回答问题。但感谢您的回复。我不是要对任何给定的月/年组合(这是您的查询提供的)的粒度数据进行平均。我试图根据给定的月份/年份来获得前两个月的平均值。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多