2016-09-01 20 views
1

私は日付範囲を持つテーブル(A)と、日付を設定したテーブル(B)を持っています。 Bの失業月はAの日付範囲内です。欠落月を特定する必要があります。私は、SQL Server 2012にどのような援助を使用してい
日付範囲と比較した欠損日付の検索

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

B

Person EffectiveDate 
123 1/1/2016 
123 2/1/2016 
123 4/1/2016 
123 5/1/2016 

Expected result would be 
123 3/1/2016 

いただければ幸いです。ありがとう!

+0

を月の数字 – scsimon

+0

月を決定するものは?テーブルAの開始日が04/01/2016、終了日が07/01/2016の場合、04〜07の間に毎月のレコードがあるはずですか? – Kramb

+0

こんにちはKramb。はい、毎月の応募がありますが、欠落している月を探す必要があります。もちろん、異なる人物レコードのために各テーブルには何千ものレコードがあります。ある期間中に支払いを逃したことに似ています。 – Dacotahsky

答えて

1

1つの方法は、2つの日付の間にすべての値を生成することです。ここで数字テーブルを使用してのアプローチです:

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; 
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; 
1

を得ることに興味を持っている場合、これは動作するはずです。このお試しください:あなたはのCTEに参加することができます

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