Tsql DateDiff缺少几个记录
我正在使用datediff函数Tsql DateDiff缺少几个记录,tsql,datediff,Tsql,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
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
这些记录应该丢失,因为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
虽然从技术上讲,这并不能执行正确的计算,因为它只是查找年份值的差异,而没有考虑日期和月份。例如,出生日期为1990年12月31日和加入日期为2008年1月1日将登记为18岁,即使该人只有17岁,1天大。我建议改为使用中提供的解决方案:
WHERE
DATEDIFF(yy,stu.stDob,stu.stJoinDt) >= 18
-- STOP HERE
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