2012-03-02 89 views
3

我需要查詢的幫助才能將按月份分組的所有值彙總爲15天。Group-By按每半個月的日期範圍

嘗試:

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

它總是明確的15天嗎?多長時間你想要一個整體的時間......一個範圍,一年?會不同的分組間隔變化? – DRapp 2012-03-02 22:24:14

+0

是的,總是15天!持續時間範圍一年,沒有變化分組 – Igor 2012-03-02 22:27:19

+2

你知道1月16日至31日是16天嗎? 2月16日至28日是13天? – ruakh 2012-03-02 22:47:53

回答

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_SUB以及DATE_ADD查找月份的最後一天(出於顯示原因)。

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

希望它有幫助。乾杯。

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 

爲例跨越一年的例子是確保2011年之前的所有2011年。隨後,我不希望在「1月」之前出現「2月」,甚至是01-15和16-的字母順序的月份。可以交換訂單,所以我在每個組內的年份(),月份()和MINIMUM日期明確訂購...即:強制數據在組內最低的一天...即:1-15 vs 16到不管...