查找与日期范围相比的缺失日期

时间:2016-09-01 16:28:39

标签: sql sql-server

我有一个表(A)有日期范围,另一个(B)只有一个设定日期。 B中缺少的月份在A的日期范围内。我需要确定缺失的月份 一个

MapViewOfFile

B

Person StartDate EndDate  
123    1/1/2016  5/1/2016  

我正在使用SQL Server 2012.任何帮助都将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

一种方法是生成两个日期之间的所有值。这是一种使用数字表的方法:

with n as (
      select row_number() over (order by (select null)) - 1 as n
      from master.spt_values
     )
select a.person, dateadd(day, n.n, a.startdate) as missingdate
from a join
     n
     on dateadd(day, n.n, a.startdate) <= day.enddate left join
     b
     on b.person = a.person and b.effectivedate = dateadd(day, n.n, a.startdate)
where b.person is null;

答案 1 :(得分:1)

试试这个:

CREATE TABLE #A (Person INT, StartDate DATE, EndDate  DATE)

INSERT INTO #A

SELECT '123','1/1/2016',  '5/1/2016'

CREATE TABLE #B(Person INT, EffectiveDate  DATE)

INSERT INTO #B
SELECT 123 ,'1/1/2016' UNION ALL  
SELECT 123 ,'2/1/2016' UNION ALL  
SELECT 123 ,'4/1/2016' UNION ALL  
SELECT 123 ,'5/1/2016'


;WITH A1
AS(
    SELECT PERSON , StartDate, EndDate 
    FROM #A

    UNION ALL

    SELECT PERSON ,DATEADD(MM,1,STARTDATE), EndDate 
    FROM A1
    WHERE DATEADD(MM,1,STARTDATE) <= EndDate 
)
SELECT PERSON , StartDate
FROM A1
WHERE 
NOT EXISTS
(
 SELECT 1 FROM #B B1 
 WHERE B1.Person = A1.PERSON 
 AND YEAR(B1.EffectiveDate) = YEAR(A1.STARTDATE) AND MONTH(B1.EffectiveDate) = MONTH(A1.STARTDATE) 
)

答案 2 :(得分:0)

如果您对失踪月份感兴趣,这应该有用

;WITH n
     AS (SELECT ROW_NUMBER() OVER(ORDER BY
                                 (
                                     SELECT NULL
                                 )) - 1 AS n
         FROM master.dbo.spt_values)
     SELECT a.person,
            DATEADD(MONTH, n.n, a.startdate) AS missingdate
     FROM a a
          INNER JOIN n ON DATEADD(MONTH, n.n, a.startdate) <= a.enddate
          LEFT JOIN b b ON MONTH(DATEADD(MONTH, n.n, a.startdate)) = MONTH(b.effectivedate) AND YEAR(DATEADD(MONTH, n.n, a.startdate)) = YEAR(b.effectivedate)
     WHERE b.person IS NULL;