mysql - 存储过程中的月份计算

标签 mysql sql date stored-procedures

我需要获取不在数据库内的月份列表。

示例:

成员

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/

相关文章:

mysql - MySQL (phpMyAdmin) 中仅显示 2 位小数,但保留所有小数位进行计算

当我使用包含连字符 (-) 的值进行搜索时,MySQL SELECT 语句不返回任何记录

sql - 具有另一个复杂类型字段的复杂类型中的空检测

c# - SQL Datareader 空值

java - 如何在 jdbc MySQL 查询中处理 0000-00-00 日期

r - 如何按日期对数据框进行排序

php - 需要一个循环发送功能的想法

Java 如何在两个表中添加数据(关系型数据库)

java - 获取用户输入以创建 mysql 数据库

sql - 伪造 SQL Server