這是一個有點棘手,你需要另一行源加入。我會用內嵌視圖爲例,否則,可能來自表..
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
這是sql服務器還是mysql?它們不是一回事,根據您使用的是哪個DBMS,答案會有所不同。 – 2014-10-06 16:45:41
它是一個MySQL數據庫。 – 2014-10-06 19:38:27