簡體   English   中英

每半個月的日期范圍分組

[英]Group-By for every half month date range

我需要一個查詢幫助,按月分組所有按月分組的值。

試:

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
.....

這基本上是從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隨你...

我認為這將完成這項工作:

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 

value corresponds to. 這里發生的是我使用DATEDIFF查找自月初以來的天數,從而找到值對應的月份的哪一半。 我還使用DATE_SUBDATE_ADD來查找該月的最后一天(出於顯示原因)。

我添加了%Y格式參數,以防日期范圍超過1年,在這種情況下,您將重復使用月份名稱。

希望能幫助到你。 干杯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM