2014-10-06 91 views
-1

我有一個表中的數據,如何找到天每月從這個數量:如何查找mysql中日期範圍內每個月的天數?

serial  |  date_from  |  date_from 
    001   |  2012-12-20  |  2013-01-25 
    002   |  2012-12-20  |  2013-01-25 
    003   |  2012-12-20  |  2013-01-25 
    001   |  2013-01-26  |  2013-04-26 

第一行所需的結果:

Serial  | days |  month 
    001   | 11 |  December, 2012 
    001   | 25 |  January, 2012 

我怎樣才能在mysql中做到這一點?

+1

這是sql服務器還是mysql?它們不是一回事,根據您使用的是哪個DBMS,答案會有所不同。 – 2014-10-06 16:45:41

+0

它是一個MySQL數據庫。 – 2014-10-06 19:38:27

回答

1

我有一個工具叫表calendar存儲所有日期,一個是可能遇到的(這是一個令人沮喪的小表)...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(serial  INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,date_from DATE NOT NULL 
,date_to DATE NULL 
); 

INSERT INTO my_table VALUES 
(001,'2012-12-20','2013-01-25'), 
(002,'2012-12-20','2013-01-25'), 
(003,'2012-12-20','2013-01-25'), 
(004,'2013-01-26','2013-04-26'); 


SELECT serial 
    , DATE_FORMAT(dt,'%Y%m') 
    , COUNT(*) total 
    FROM calendar c 
    JOIN my_table x 
    ON c.dt > x.date_from 
    AND c.dt <= date_to 
GROUP 
    BY serial 
    , DATE_FORMAT(dt,'%Y%m'); 

+--------+------------------------+-------+ 
| serial | DATE_FORMAT(dt,'%Y%m') | total | 
+--------+------------------------+-------+ 
|  1 | 201212     | 11 | 
|  1 | 201301     | 25 | 
|  2 | 201212     | 11 | 
|  2 | 201301     | 25 | 
|  3 | 201212     | 11 | 
|  3 | 201301     | 25 | 
|  4 | 201301     |  5 | 
|  4 | 201302     | 28 | 
|  4 | 201303     | 31 | 
|  4 | 201304     | 26 | 
+--------+------------------------+-------+ 

...或者類似的東西

+0

是一個日曆表來拯救!!這個鏈接有一個日曆表的真棒解釋:http://www.brianshowalter.com/calendar_tables – 2014-10-07 18:33:25

0

這是一個有點棘手,你需要另一行源加入。我會用內嵌視圖爲例,否則,可能來自表..

SELECT t.service, expr, DATE_FORMAT(m._month,'%Y-%m') 
    FROM (SELECT '2012-12-01' AS _month 
      UNION ALL SELECT '2013-01-01' 
      UNION ALL SELECT '2013-02-01' 
      UNION ALL SELECT '2013-03-01' 
      UNION ALL SELECT '2013-04-01' 
     ) m 
    JOIN mytable t 
    ON ... 

WHERE ... 

棘手的部分是被獲取JOIN權限的表達式(檢查日期範圍與月份的任何重疊),並獲取表達式以返回天數。

像這樣的東西應該返回指定的結果:

SELECT d.serial 
    , DATEDIFF(LEAST(d.date_to+INTERVAL 1 DAY,m._month+INTERVAL 1 MONTH) 
       ,GREATEST(d.date_from,m._month) 
     ) AS `days` 
    , DATE_FORMAT(m._month,'%M, %Y') AS `month` 
    -- , d.date_from 
    -- , d.date_to 
    -- , m._month 
    FROM daterange d 
    JOIN (SELECT '2012-11-01' AS _month 
      UNION ALL SELECT '2012-12-01' 
      UNION ALL SELECT '2013-01-01' 
      UNION ALL SELECT '2013-02-01' 
      UNION ALL SELECT '2013-03-01' 
      UNION ALL SELECT '2013-04-01' 
      UNION ALL SELECT '2013-05-01' 
     ) m 
    ON m._month >= DATE_FORMAT(d.date_from,'%Y-%m-01') 
    AND m._month <= DATE_FORMAT(d.date_to ,'%Y-%m-01') 
ORDER BY d.serial, m._month 
0

我會計算下個月的第一天,然後計算兩個日期之間的差異。

SELECT Serial, 
    DATEDIFF(DATE_FORMAT(date_from + INTERVAL 1 MONTH, '%Y-%m-01'), date_from)-1 AS `days`, 
    DATE_FORMAT(date_from, '%M, %Y') AS `month` 
FROM your_table_name