यदि आपके दिनांक अंतराल को नेस्टेड या इंटरसेक्टिंग नहीं किया जाएगा, तो आप JOIN
के साथ ट्रिक का उपयोग कर सकते हैं परिणाम सेट का उत्पादन करने के लिए। इसलिए, वांछित रिकॉर्ड सेट का चयन करने के लिए, आपको निम्न की आवश्यकता होगी:
SELECT
*
FROM
(SELECT
ends.point AS date_start,
starts.point AS date_end
FROM
(SELECT
d.date_end+INTERVAL 1 DAY AS point,
@n:[email protected]+1 AS num
FROM
d
CROSS JOIN (SELECT @n:=1) AS init0
) AS ends
INNER JOIN
(SELECT
d.date_start-INTERVAL 1 DAY AS point,
@m:[email protected]+1 AS num
FROM
d
CROSS JOIN (SELECT @m:=0) AS init1
) AS starts
ON ends.num=starts.num
UNION ALL
SELECT
'2014-01-01',
MIN(date_start) - INTERVAL 1 DAY AS date_end
FROM
d
HAVING
date_end>'2014-01-01'
UNION ALL
SELECT
MAX(date_end)+INTERVAL 1 DAY AS date_start,
'2014-12-31'
FROM
d
HAVING
date_start<'2014-12-31'
) as dates
WHERE
date_start<=date_end
ORDER BY
date_start;
जिसका परिणाम होगा
+------------+------------+ | date_start | date_end | +------------+------------+ | 2014-01-01 | 2014-03-04 | | 2014-04-11 | 2014-04-30 | | 2014-06-06 | 2014-07-09 | | 2014-08-16 | 2014-12-31 | +------------+------------+
(fiddle इसके लिए यहाँ है)
अपनी तालिका को "पूर्ण" करने के लिए आप INSERT..SELECT
SELECT
. के साथ सिंटैक्स ऊपर क्वेरी।