将MONTH传递给子查询时,SQL select子查询将永远运行

时间:2015-09-08 21:45:22

标签: mysql sql subquery

此查询的目的: 数据库中的合同具有开始日期,合同日期和结束日期。 合同到期时,合约日期已设定,截止日期将设定为未来约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

我正在努力获取一些样本数据

是否有其他方法可以按查询执行分组?

2 个答案:

答案 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

即可