每半个月的日期范围分组

时间:2012-03-02 22:19:12

标签: mysql group-by sum

我需要一个查询帮助,按月分组所有按月15天的值。

尝试:

SELECT  sum(price) From table WHERE ADD_DATE( date, INTERVAL 15 DAY);

预期结果:

Jan Day 1 - 15 = 5.2
Jan Day 16 - 31 = 80.4

Feb Day 1 - 15 = 50
Feb Day 16 - 28 = 80.2
.....

2 个答案:

答案 0 :(得分:4)

这基本上是从1月15日和16月底分解的提取物。 MySQL有一个很好的简单函数“Last_Day()”,它返回给定月份的最后一天

select
        CONCAT( DATE_FORMAT(`date`, '%b %Y Day ' ),
            case when dayofmonth( `date` ) < 16
                then '01-15'
                else CONCAT( '16-', right( last_day( `date` ), 2)  )
                end ) as CharMonth,
        sum( price ) as TotalPrice
    from 
        invoice
    group by
        CharMonth
    order by
        year( `date` ),
        month( `date` ),
        min( dayofmonth( `date` ))

以上将显示

的示例
CharOfMonth         TotalPrice
Dec 2011 Day 01-15  226.98
Dec 2011 Day 16-31  108.12
Jan 2012 Day 01-15  983.08
Jan 2012 Day 16-31  235.02
Feb 2012 Day 01-15  271.29
Feb 2012 Day 16-29  382.91
Mar 2012 Day 01-15  900.28

此示例中跨越一年的订单的目的是确保2012年之前的所有2011年。随后,我不希望在“Jan”之前出现“Feb”的alpha顺序的月份,甚至是01-15和16- ??可以换成顺序,所以我明确地按每个组内的年(),月()和最小日排序...即:强制组内最低日数据...即:1-15 vs 16 to无论...

答案 1 :(得分:1)

我认为这将完成这项工作:

SELECT SUM(price) AS price_sum, month_half FROM
(
  SELECT price, 
  IF(
    DATEDIFF(`date`, DATE_FORMAT(`date`, "%Y-%m-01")) > 15,
    CONCAT(
      DATE_FORMAT(`date`, "%b %Y Day 16 - "), 
      DATE_FORMAT(
      DATE_SUB(
        DATE_ADD(DATE_FORMAT(`date`, "%Y-%m-01"), INTERVAL 1 MONTH), 
      INTERVAL 1 DAY), "%d"
      )
    ),
    DATE_FORMAT(`date`, "%b %Y Day 1 - 15")
    ) AS month_half,
  `date` AS order_date  
  FROM table WHERE 
  `date` >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
) AS t 
GROUP BY month_half ORDER BY order_date 

这里发生的是我使用 DATEDIFF 来查找自月初以来的天数,从而找出 date 值对应的月份的哪一半至。 我还使用 DATE_SUB DATE_ADD 来查找当月的最后一天(显示原因)。

我添加了%Y 格式参数,以防日期范围超过1年,在这种情况下,您将重复使用月份名称。

希望它有所帮助。欢呼声。