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
本次查询的目的: 数据库中的合同有开始日期、合同日期和结束日期。 当合同待定时,合同日期被设定,并且关闭日期被设置为未来大约 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