1

我有一个看起来有点像这样的数据表 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

在 table1 中添加记录之前,我需要检查 Person 的年度记录数 (table1) 是否低于该 Person 的 MaxRecord 数 (table2)。按年度,我的意思是 startDate = 注册日期和 endDate = 注册日期 + 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

构建此输出后,我可以测试是否允许新记录的日期(对于一个人)。

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

4

1 回答 1

0

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

您可以通过将注册日期表 (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;

这给出了一个类似的表(仅适用于汤姆并WHERE n.Number <= 3;作为示例添加):

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

SQL Fiddle 示例

然后,您需要将其加入您的其他日期表 (T) 以进行计数:

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

SQL-Fiddle 的完整示例

我使用这条线将结果限制在 StartDate 小于今天的位置

WHERE   DATE_ADD(r.RegisterDate, INTERVAL n.Number YEAR) <= CURRENT_TIMESTAMP

您显然可以根据需要更改此设置

于 2013-10-02T08:39:58.147 回答