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

SQL select subquery runs forever when passing MONTH to sub query

本次查询的目的: 数据库中的合同有开始日期、合同日期和结束日期。 当合同待定时,合同日期被设定,并且关闭日期被设置为未来大约 40 天。我需要 运行 一个查询,以获取合同日期在过去和尚未达到的截止日期的合同,以查找该月未决合同的数量。此查询生成上一整月和回溯 12 个月的未决合同报告。

我的想法是获取每个月的最后一天,并计算截止日期>当月最后一天且合约日期<=当月最后一天的合约数量

以下查询在 51 毫秒内执行。 7 月

的查询 returns 行
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 'm' 和 'y' 导致了问题。如果我硬编码一个日期,它会按预期执行。

预期输出:

 Month | Year | total
  8    | 2015 | 74
  7    | 2015 | 87
  6    | 2015 | 45

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

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

这个怎么样? (假设截止日期是日期时间)

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
;

解决这个问题的简单方法是创建一个 months table,这很容易做到,因为整个世纪只需要 1200 行。

CREATE TABLE months (
   month_id  int,
   beginDay  date,
   lastDay   date
)

那么你的查询就变得简单多了。只需加入并计算 between