如何在MySQL中查找一年中从1月到7月丢失的月数

如何在MySQL中查找一年中从1月到7月丢失的月数,mysql,date,datetime,count,Mysql,Date,Datetime,Count,我有一个名为View_uncollected的视图 |RemitNo|ID|Employer| AP_From | AP_To |Amount| | 1 |1 | a |2016-01-01|2016-01-31|200.00| | 2 |1 | a |2016-02-01|2016-02-29|200.00| | 3 |1 | a |2016-03-01|2016-03-31|200.00| | 4 |1 | a

我有一个名为View_uncollected的视图

|RemitNo|ID|Employer|  AP_From |  AP_To   |Amount|
|   1   |1 |    a   |2016-01-01|2016-01-31|200.00|
|   2   |1 |    a   |2016-02-01|2016-02-29|200.00|
|   3   |1 |    a   |2016-03-01|2016-03-31|200.00|
|   4   |1 |    a   |2016-04-01|2016-05-31|400.00|
|   5   |1 |    a   |2016-06-01|2016-06-30|200.00|
|   6   |2 |    b   |2016-01-01|2016-03-31|600.00|
|   7   |2 |    b   |2016-04-01|2016-04-30|200.00|
|   8   |2 |    b   |2016-05-01|2016-05-31|200.00|
|   9   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  10   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  11   |3 |    c   |2016-03-01|2016-03-31|200.00|
我需要找出从2016年1月到7月少了多少个月

根据上表,存在一些复杂情况:

员工仅在2016年1月至6月支付。还差一个月。 雇员B仅在2016年1月至5月支付。还差两个月。 雇主于1月2日和3月支付工资。还差5个月。我们不会考虑一月的其他付款方式是二月。 我如何计算每个雇主的缺勤月数

我所做的是使用这个7-count的分组ID,因为我认为每一行=一个月。但在审查我的结果后,有些雇主有一排=2个月,比如4个月。我当时知道这是错误的,因为它只计算行数,而不计算月数

这背后的原因是,我们需要知道2016年1月至7月有多少汇款未收


谢谢你的建议和评论。抱歉,这是一个新手问题

这是一个基本查询,允许您获取已支付的月份

部分结果:

最后查询:

输出


计算两个日期之间的差值并将所有行相加如何

SELECT Employer, 7-SUM(TIMESTAMPDIFF(MONTH, AP_from, DATE_ADD(AP_to,INTERVAL 1 DAY))) as missingmonth 
FROM tablename
GROUP BY Employer;

考虑以下几点

SELECT * FROM my_table;
+---+
| i |
+---+
| 2 |
| 3 |
| 5 |
| 8 |
+---+

SELECT 7 - COUNT(DISTINCT i) x FROM my_table WHERE i BETWEEN 1 AND 7;
+---+
| x |
+---+
| 4 |
+---+

在本例中,我使用了一个简单的整数列,我称之为I,但它也可以是日期。其他人建议您需要某种日历或实用工具表。我在证明你不会。我只是从应该存在的数字中减去不同月份/整数的数量

|RemitNo|ID|Employer|  AP_From |  AP_To   |Amount|
|   1   |1 |    a   |2016-01-01|2016-01-31|200.00|
|   2   |1 |    a   |2016-02-01|2016-02-29|200.00|
|   3   |1 |    a   |2016-03-01|2016-03-31|200.00|
|   4   |1 |    a   |2016-04-01|2016-05-31|400.00|
|   5   |1 |    a   |2016-06-01|2016-06-30|200.00|
|   6   |2 |    b   |2016-01-01|2016-03-31|600.00|
|   7   |2 |    b   |2016-04-01|2016-04-30|200.00|
|   8   |2 |    b   |2016-05-01|2016-05-31|200.00|
|   9   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  10   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  11   |3 |    c   |2016-03-01|2016-03-31|200.00|
根据上表,存在一些复杂情况:

员工仅在2016年1月至6月支付。少了一个月 从它。 雇员B仅在2016年1月至5月支付。2个月就够了 错过了。 雇主于1月2日和3月支付工资。5个月是 错过了。我们不会考虑一月的其他付款方式。 二月 现在,在我看来,雇主a全额支付了2016年1月1日至2016年6月30日期间到期的款项,6月份的款项已在汇款4上支付。如果我们选择按雇主分组的总金额,我们将得到

|Employer|Sum    |
|   a    |1200.00|
|   b    |1000.00|
|   c    | 600.00|
现在,如果我们假设每个雇主每月需要支付200英镑,并且从2016-01-01到2016-06-30的累计月数为6个月,那么最合理的查询是

从表中选择雇主,200*6-累计金额作为余额,累计金额/200作为到期月,其中AP_FROM=>“2016-01-01”和AP_To 0

我还没有测试脚本,但我相信这正是您所需要的

编辑:
我相信这已经解决了,尽管没有任何答案被标记为正确答案。:]

你需要一个日历表,谷歌搜索,大量的在线教程只是想知道如果在同一笔付款上支付几个月,金额不应该超过一个月吗?@JuanCarlosOropeza是的,先生,我现在编辑我的示例。你还应该检查描述,因为数据显示a在五次付款中支付了全部6个月,b在三次付款中只遗漏了一次Sir,选择“五月”作为月份,“2016-05-01”作为开始,“2016-05-31”作为结束工会都遗漏了吗?先生,我在汇款4中的例子是从2016-04-01-2016-05-31是从四月到五月怎么样?怎么了?如果你看到部分结果,你会看到这两个月,i代表什么?在这个例子中,我使用了一个简单的整数列,我称之为i,但它也可以很容易地成为日期。其他人建议您需要某种日历或实用工具表。我在证明你不会。我只是从应该存在的数字中减去不同月份/整数的数量。
|RemitNo|ID|Employer|  AP_From |  AP_To   |Amount|
|   1   |1 |    a   |2016-01-01|2016-01-31|200.00|
|   2   |1 |    a   |2016-02-01|2016-02-29|200.00|
|   3   |1 |    a   |2016-03-01|2016-03-31|200.00|
|   4   |1 |    a   |2016-04-01|2016-05-31|400.00|
|   5   |1 |    a   |2016-06-01|2016-06-30|200.00|
|   6   |2 |    b   |2016-01-01|2016-03-31|600.00|
|   7   |2 |    b   |2016-04-01|2016-04-30|200.00|
|   8   |2 |    b   |2016-05-01|2016-05-31|200.00|
|   9   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  10   |3 |    c   |2016-01-01|2016-01-31|200.00|
|  11   |3 |    c   |2016-03-01|2016-03-31|200.00|
|Employer|Sum    |
|   a    |1200.00|
|   b    |1000.00|
|   c    | 600.00|