2011-09-26 54 views
0

我使用DATEDIFF函数则DateDiff缺少一些记录

SELECT stName 
     ,stId 
     ,stDob --(varchar(15)) 
     ,stJoinDt --(datetime) 
FROM student stu 
WHERE 
DATEDIFF(yy,stu.stDob,stu.stJoinDt) between 18 and 75 

由于运营商之间是不是有效的,我也改变了代码

SELECT stName 
      ,stId 
      ,stDob 
      ,stJoinDt 
    FROM student stu 
    WHERE 
    DATEDIFF(yy,stu.stDob,stu.stJoinDt) >= 18 
    AND DATEDIFF(yy,stu.stDob,stu.stJoinDt) < 75 

是否有写DATEDIFF任何其他有效的方法捕获所有缺失的记录?

The missing records are 
stDob    stJoinDt 
10/08/1925  2011-01-03 
04/18/1935  2011-01-19 
12/11/1928  2011-06-06 
1/24/1927   2011-04-18 
04/18/1918  2011-04-20 
+1

哪些记录丢失? – Gabe

回答

2

这些记录应该丢失,因为stDob和stJoinDt之间的年数是18和75之间不,为你过滤出来与你的条件是stDob和stJoinDt 18之间相差75年:

with student as (
    select 'Bob' as stName, 1 as stId, '10/08/1925' as stDob,  '2011-01-03' as stJoinDt 
    union select 'Bob' as stName, 2 as stId, '04/18/1935',  '2011-01-19' 
    union select 'Bob' as stName, 3 as stId, '12/11/1928',  '2011-06-06' 
    union select 'Bob' as stName, 4 as stId, '1/24/1927 ',  '2011-04-18' 
    union select 'Bob' as stName, 5 as stId, '04/18/1918',  '2011-04-20' 
) 
    SELECT stName 
      ,stId 
      ,stDob --(varchar(15)) 
      ,stJoinDt --(datetime) 
      ,datediff(yy, stu.stDob, stu.stJoinDt) as DiffYears 
    FROM student stu 

输出:

stName stId stDob   stJoinDt DiffYears 
Bob  1  10/08/1925  2011-01-03 *86* (>75) 
Bob  2  04/18/1935  2011-01-19 *76* (>75) 
Bob  3  12/11/1928  2011-06-06 *83* (>75) 
Bob  4  1/24/1927  2011-04-18 *84* (>75) 
Bob  5  04/18/1918  2011-04-20 *93* (>75) 

我的猜测你会想要捕获该人至少18岁的所有记录。在这种情况下,从过滤器去除75部分:

WHERE 
DATEDIFF(yy,stu.stDob,stu.stJoinDt) >= 18 
-- STOP HERE 

虽然技术上并不执行正确的计算,因为它只是发现在年值的差异,并没有考虑到日和月。例如,12/31/1990的出生日期和1/1/2008的加入日期将注册为18年,尽管该人只有17岁,即1天。我会推荐使用this question中提供的解决方案:

where 
    (DATEDIFF(YY, stu.stDob, stu.stJoinDt) - 
     CASE WHEN( 
      (MONTH(stDob)*100 + DAY(stDob)) > (MONTH(stJoinDt)*100 + DAY(stJoinDt)) 
     ) THEN 1 ELSE 0 END 
    ) >= 18