此查询的目的: 数据库中的合同具有开始日期,合同日期和结束日期。 合同到期时,合约日期已设定,截止日期将设定为未来约40天。我需要运行一个查询,该查询获得过去具有合同日期和未达到的结束日期的合同,以查找该月份的待处理合同数量。此查询生成上一个完整月份的待处理合同报告,并返回12个月。
我的想法是获取每个月的最后一天并计算截止日期>的合同数量。月份的最后一天和合同日期< =月的最后一天
以下查询在51ms内执行。查询返回7月的行
SELECT DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH), '%Y-%m-%d 23:59:59') as lastDay,
count(*) as total FROM contracts
WHERE L_ClosingDate >= DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH), '%Y-%m-%d 23:59:59')
AND L_ContractDate <= DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH), '%Y-%m-%d 23:59:59')
现在我需要运行查询以获取按月分组的行,因此我将查询更改为以下内容:
select MONTH(L_ClosingDate) as m, YEAR(L_ClosingDate) as y,
(SELECT count(*) FROM contracts WHERE L_ClosingDate >= DATE_FORMAT(LAST_DAY(CONCAT(y,'-',m,'-',LPAD(1,2,'00'))), '%Y-%m-%d 23:59:59')
AND L_ContractDate <= DATE_FORMAT(LAST_DAY(CONCAT(y,'-',m,'-',LPAD(1,2,'00'))), '%Y-%m-%d 23:59:59')
) as total
FROM contracts
WHERE L_ClosingDate > DATE_ADD(NOW(), INTERVAL -2 MONTH)
AND L_CLosingDate < DATE_ADD(NOW(), INTERVAL -1 MONTH)
GROUP BY YEAR(L_ClosingDate), MONTH(L_ClosingDate)
ORDER BY L_ClosingDate DESC
永远执行...... 我调整了它,发现了MONTH和YEAR&#39; m&#39;并且&#39; y&#39;在子查询中导致问题。如果我硬编码它按预期执行的日期。
预期产出:
Month | Year | total
8 | 2015 | 74
7 | 2015 | 87
6 | 2015 | 45
我正在努力获取一些样本数据
是否有其他方法可以按查询执行分组?
答案 0 :(得分:1)
这个怎么样? (假设截止日期是日期时间)
SELECT MONTH(L_ClosingDate) as m, YEAR(L_ClosingDate) as y
, count(*) as total
FROM contracts
WHERE L_ClosingDate >= LAST_DAY(CURDATE() - INTERVAL 3 MONTH) + 1 DAY
AND L_CLosingDate < LAST_DAY(CURDATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY
GROUP BY m, y
ORDER BY y DESC, m DESC
;
答案 1 :(得分:1)
解决这个问题的简单方法是创建一个months
表,这很容易做到,因为整个世纪只需要1200行。
CREATE TABLE months (
month_id int,
beginDay date,
lastDay date
)
然后您的查询变得更加简单。只需加入并计算between