我需要获取不在数据库内的月份列表。
示例:
表成员
ID | Member's code | Member since
1 | 555-12 | 2012-11-22
表成员资格
ID | Code | Paid
1 | 555-12 | 2013-1-1
2 | 555-12 | 2013-3-12
3 | 555-12 | 2013-5-1
假设今天是:2013-11-17
我需要得到这样的输出:
Member's code | Debt ( Months )
555-12 | 11-2012
555-12 | 12-2012
555-12 | 2-2013
555-12 | 4-2013
这可以用 SQL 来完成吗?我是否需要有一个存储过程
来传递成员代码
?
最佳答案
我的想法是使用一个数字表,其中只包含从 0 到 100 或更多的数字:
CREATE TABLE numbers (
n INT
);
INSERT INTO numbers (n)
VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15)...;
然后您可以使用如下查询:
SELECT
m.ID,
m.Code,
DATE_FORMAT(m.Member_since + INTERVAL num.n MONTH, '%m-%Y') As Debt_Month_Year
FROM
members m INNER JOIN numbers num
ON TIMESTAMPDIFF(MONTH, m.Member_since, LAST_DAY(CURDATE()))>=num.n
LEFT JOIN membership ms
ON
m.Code = ms.Code
AND
LAST_DAY(ms.Paid)=LAST_DAY(m.Member_since + INTERVAL num.n MONTH)
WHERE
ms.id IS NULL
-- and if you wish, add the following line:
AND m.Code = '555-12'
请参阅 fiddle here .
关于mysql - 存储过程中的月份计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20029149/