आप सही तर्ज पर हैं। आपको अपनी क्वेरी को उन महीनों की तालिका के साथ जोड़ना होगा जिनके लिए आप डेटा चाहते हैं, जो या तो स्थायी हो सकता है या (जैसा कि नीचे मेरे उदाहरण में दिखाया गया है) एक UNION
में गतिशील रूप से बनाया गया है सबक्वेरी:
SELECT YEAR(month.d),
MONTHNAME(month.d),
SUM(1 + DATEDIFF( -- add 1 because start&finish on same day is still 1 day
LEAST(Checkout, LAST_DAY(month.d)), GREATEST(Checkin, month.d)
)) AS days
FROM bookingdata
RIGHT JOIN (
SELECT 20110101 AS d
UNION ALL SELECT 20110201 UNION ALL SELECT 20110301
UNION ALL SELECT 20110401 UNION ALL SELECT 20110501
UNION ALL SELECT 20110601 UNION ALL SELECT 20110701
UNION ALL SELECT 20110801 UNION ALL SELECT 20110901
UNION ALL SELECT 20111001 UNION ALL SELECT 20111101
UNION ALL SELECT 20111201
) AS month ON
Checkin <= LAST_DAY(month.d)
AND month.d <= Checkout
GROUP BY month.d
इसे sqlfiddle पर देखें ।