Mysql 在SQL中迭代思想日期
我有一个数据表1,看起来有点像: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
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