Mysql 在SQL中迭代思想日期

Mysql 在SQL中迭代思想日期,mysql,sql,iteration,Mysql,Sql,Iteration,我有一个数据表1,看起来有点像: Record# Date Person 1 12/12/2012 Tom 2 01/02/2013 Tom 3 10/02/2013 Tom 4 02/01/2013 John 5 04/01/2014 John 6 30/06/2010 Mary 7 30/06/2011 Mary 8 30/06/2012 Mary 9 3

我有一个数据表1,看起来有点像:

Record# Date        Person
1       12/12/2012  Tom
2       01/02/2013  Tom
3       10/02/2013  Tom
4       02/01/2013  John
5       04/01/2014  John
6       30/06/2010  Mary
7       30/06/2011  Mary
8       30/06/2012  Mary
9       30/07/2012  Mary
另一个表2是每个人的注册日期

Person  RegisterDate   MaxRecord
Tom     15/12/2011     100
John    01/01/2013     10
Mary    16/06/2010     50
在表1中添加记录之前,我需要检查每个人的记录表1的年度计数是否低于该人的MaxRecord编号表2。按年计算,我的意思是开始日期=注册日期,结束日期=注册日期+1年,而不是从1月1日到12月31日

如果我想为Mary添加记录,我想编写SQL,它将为我提供以下输出:

StartDate   EndDate     CountRecord
16/06/2010  15/06/2011    1
16/06/2011  15/06/2012    1
16/06/2012  15/06/2013    2
一旦生成了这个输出,我就可以测试一个人的新记录的日期是否被允许


有人能给我一个线索,一个教程的链接或一些帮助吗?

对于以下内容,我假设您已经有了一个数字表,如果您没有数字表,那么我建议您制作一个,但是如果您不想,那么您可以

通过将注册日期表RegDate与数字表交叉连接,可以获得所有边界的列表:

SELECT  r.Person, 
        DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) PeriodStart,
        DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR) PeriodEnd,
        n.Number
FROM    RegDate r
        CROSS JOIN Numbers n;

这张桌子就像是给汤姆的一样,加上n号。你好,我回来问一些问题。到目前为止,我使用的是一个正在运行的编号列表。但是现在,我想优化数据库,并按照您的建议使用数字表。问题是当我使用那个编号的表时,sql结果是空的!!!不知道为什么。下面是sql scriptCREATE表(如果不存在)ass_numbers SeqValue int3 NOT NULL ENGINE=MyISAM DEFAULT CHARSET=utf8;--表ASSU编号的内容-将值0、1、2、3、4、5、6、7、8、9、10插入ASSU编号中;
Person  PERIODSTART   PERIODEND   NUMBER
Tom     15/12/2011    15/12/2012    0
Tom     15/12/2012    15/12/2013    1
Tom     15/12/2013    15/12/2014    2
Tom     15/12/2014    15/12/2015    3
SELECT  r.Person,
        DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) StartDate,
        DATE_ADD(DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR), INTERVAL -1 DAY) EndDate,
        COUNT(T.Record) AS `CountRecord`
FROM    RegDate r
        CROSS JOIN Numbers n
        LEFT JOIN T
            ON T.Person = r.Person
            AND T.Date >= DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR)
            AND T.Date < DATE_ADD(r.RegisterDate, INTERVAL n.Number + 1 YEAR)
WHERE   DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) <= CURRENT_TIMESTAMP
AND     r.Person = 'Mary'
GROUP BY r.Person, R.RegisterDate, n.Number;
PERSON  STARTDATE   ENDDATE     COUNTRECORD
Mary    2010-06-16  2011-06-15      1
Mary    2011-06-16  2012-06-15      2
Mary    2012-06-16  2013-06-15      1
Mary    2013-06-16  2014-06-15      0
WHERE   DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) <= CURRENT_TIMESTAMP