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
어떤 레코드가 누락 되었습니까? – Gabe