SQL SERVER:选择两个日期之间缺少的月份(同年)

Ahm*_*med 2 sql-server

我试图获得同一年没有交易的所有月份(如果不可能有不同的年份)

这是我在两个日期之间进行交易的查询,但不知道如何只选择缺少数据库中的事务的月份

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 nulli.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)

Gio*_*sos 5

使用以下递归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)