我试图获得同一年没有交易的所有月份(如果不可能有不同的年份)
这是我在两个日期之间进行交易的查询,但不知道如何只选择缺少数据库中的事务的月份
SELECT *
FROM Installment
WHERE OrderId = 1
AND InstallmentDate
BETWEEN cast('8/02/2014' as date)
AND cast('12/25/2014' as date)
InstallmentId OrderId CustomerKey InstallmentAmount InstallmentDate
18 1 INS-1 3000 2014-09-03
92 1 INS-1 3000 2014-10-13
137 1 INS-1 3000 2014-11-05
Run Code Online (Sandbox Code Playgroud)
在这种情况下,缺少第12个月和第8个月的记录,如何使用SQL Server查询获得此记录?
更新
select yymm.yy, yymm.mm
from (select distinct year(InstallmentDate) as yy, month(InstallmentDate) as mm
from Installment
where InstallmentDate BETWEEN '2014-09-02' and '2015-01-15'
) yymm left join
Installment i
on i.OrderId = 1 and
year(i.InstallmentDate) = yymm.yy and
month(i.InstallmentDate) = yymm.mm
where i.OrderId is not null;
Run Code Online (Sandbox Code Playgroud)
Gordon的查询从两个日期之间的表中返回所有年份和月份,只需更改i.OrderId is null为i.OrderId is not null此处就是他的查询
yy mm
2014 9
2014 10
2014 11
Run Code Online (Sandbox Code Playgroud)
预期产出(如果可能)
yy mm
2014 12
2015 1
Run Code Online (Sandbox Code Playgroud)
使用以下递归CTE:
DECLARE @start DATE = '2014-09-02'
DECLARE @end DATE = '2015-01-15'
;WITH IntervalDates (date)
AS
(
SELECT @start
UNION ALL
SELECT DATEADD(MONTH, 1, date)
FROM IntervalDates
WHERE DATEADD(MONTH, 1, date)<=@end
)
SELECT YEAR(date) AS Year, MONTH(date) AS Month
FROM IntervalDates
Run Code Online (Sandbox Code Playgroud)
您可以获得两个感兴趣日期之间所有年/月的列表:
Year Month
==============
2014 9
2014 10
2014 11
2014 12
2015 1
Run Code Online (Sandbox Code Playgroud)
使用EXCEPT上面的CTE:
;WITH IntervalDates (date)
AS
(
SELECT @start
UNION ALL
SELECT DATEADD(MONTH, 1, date)
FROM IntervalDates
WHERE DATEADD(MONTH, 1, date)<=@end
)
SELECT YEAR(date) AS Year, MONTH(date) AS Month
FROM IntervalDates
EXCEPT
SELECT DISTINCT YEAR(InstallmentDate) AS yy, MONTH(InstallmentDate) AS mm
FROM Installment
WHERE OrderId = 1 AND InstallmentDate BETWEEN @start AND @end
Run Code Online (Sandbox Code Playgroud)
产生所需的结果集:
Year Month
=============
2014 12
2015 1
Run Code Online (Sandbox Code Playgroud)