2011-09-26 3 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 

을 사용하고는 DATEDIFF 작성하는 다른 효과적인 방법이 있나요 나는 또한

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

에 코드를 변경 한 효과가 없습니다 모든 누락 된 기록을 포착 할 수 있습니까?

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) 사이에 차이가 있음을 당신이 당신의 조건을 필터링대로 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 

을 기술적으로이 정확한 계산을 수행하지 않지만, 그것은 단지 년 값의 차이를 발견하고 계정의 월과 일을 고려하지 않기 때문에. 예를 들어, 생년월일이 1990 년 12 월 31 일이고 가입 날짜가 1/1/2008 일 경우 사람이 17 세, 1 일 밖에되지 않은 경우에도 18 년으로 등록됩니다. 대신 제공된 솔루션을 사용하는 것이 좋습니다 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