2013-04-09 73 views
3

我使用SQL Server 2008R2,我需要找出缺失的日期。找出缺失的日期

ID College Dept JoiningDate 
    1 SAEC  CSE 1/2/2008 
    2 MSEC  EEE 4/2/2008 
    3 GOV  ECE 8/2/2008 
    4 JKP  CSE 9/2/2008 
    5 VLM  CSE 10/2/2008 
    6 PTR  CSE 13/2/2008 

JoiningDate 
2/2/2008 
3/2/2008 
5/2/2008 
6/2/2008 
7/2/2008 
11/2/2008 
12/2/2008 
+3

请指定您使用的数据库 – 2013-04-09 12:18:17

+0

您必须从另一个包含所有日期的表中加入。所以你可以通过在连接值中检查null来获取缺失的日期。 – rahularyansharma 2013-04-09 12:19:43

+0

你的db没有被你提及。有一次,我问过类似的问题,对于SQL Server 2008,所以你可以检查这个,如果你只是在寻找逻辑http://stackoverflow.com/questions/12890967/show-all-dates-data-between-two-dates-if- no-row-exists-for-particular-date-then – rahularyansharma 2013-04-09 12:20:32

回答

3

我已经提供你same type question link在评论输出,如果你仍然有困惑,你可以检查此如下

;with d(date) as (
    select cast('2/1/2008' as datetime) 
    union all 
    select date+1 
    from d 
    where date < '2/13/2008' 
) 

select d.date CDate 
from d 
left join CollegeDate t 
on t.JoiningDate = d.date 
WHERE ID is null 
order by d.date 

SQL FIDDLE LINK

0

试试这个脚本,它找出没有指定常量的缺失日期 -

DECLARE @CollegeDate TABLE 
(
    College NVARCHAR(10) 
, Dept NVARCHAR(10) 
, JoiningDate DATETIME 
) 

INSERT INTO @CollegeDate (College, Dept, JoiningDate) 
VALUES 
('SAEC', 'CSE', '2/1/2008'), 
('MSEC', 'EEE', '2/4/2008'), 
('GOV', 'ECE', '2/8/2008'), 
('JKP', 'CSE', '2/9/2008'), 
('VLM', 'CSE', '2/10/2008'), 
('PTR', 'CSE', '2/13/2008') 

;WITH dateout AS 
(
SELECT 
    JoiningDate = MIN(JoiningDate) 
, MaxJoiningDate = MAX(JoiningDate) 
FROM @CollegeDate 

UNION ALL 

SELECT 
    JoiningDate + 1 
, MaxJoiningDate 
FROM dateout 
WHERE JoiningDate < MaxJoiningDate 
) 

SELECT d.JoiningDate 
FROM dateout d 
WHERE d.JoiningDate NOT IN (SELECT c.JoiningDate FROM @CollegeDate c) 
ORDER BY d.JoiningDate