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