2017-07-25 25 views
1

我想根据datediff函数将年数累加。假设我有两个日期:20/07/201511/10/1976。在获得差异后,我将这些天分为365天,将其转换为年。因此,我应该得到38.79726027年,在那里我凑了,将得到39.从datediff函数中获得的综述年数

但是,我的tqsl脚本似乎没有提供预期的答案。任何人都可以帮我查询吗?

​​
+0

'DATEDIFF'返回'int's。没有什么可以从它的回报价值中取舍。四舍五入有什么可接受的“晃动”?即可以计算月份差异和分割是可以接受的?否则,你必须在几天内做到这一点,但随后会出现闰年问题。由于'DATEDIFF'计算*转换*,它将始终生成一个等于或小于您可能需要的“人类”值的数字。 –

+0

简而言之,如果你想没有四舍五入,你应该自己计算一下,比如'DATEDIFF(DAY,'19761011','20150720')/ 365.00' – ASpirin

回答

0

这样做:

ROUND(ceiling(DATEDIFF(year,[Date of Birth], [Risk_Comm Date])),0) 

会导致:39.0

而且,

CAST(ROUND(ceiling(DATEDIFF(year,[Date of Birth], [Risk_Comm Date])),0) as int) 

会导致:39

但按我的知识DATEDIFF应该retur n INT默认

0

您可以通过考虑竞争者和选择最接近风险日期的年龄来获得“四舍五入”的年龄。我使用的是CTE这里挑竞争者,其他选项可能是APPLY

declare @t table (DOB datetime not null, RiskDate datetime not null); 
insert into @t(DOB,RiskDate) values ('19761011','20150720'); 

;With Contenders as (
    select 
     DATEDIFF(year,DOB,RiskDate) as Age1, 
     DATEDIFF(year,DOB,RiskDate)+1 as Age2, 
     * 
    from @t 
) 
select 
    CASE WHEN 
     DATEDIFF(day,RiskDate,DATEADD(year,Age2,DOB)) < 
     DATEDIFF(day,DATEADD(year,Age1,DOB),RiskDate) 
     THEN Age2 
     ELSE Age1 
    END as RoundedAge 
from Contenders 

通过仔细考虑,我把参数在最后DATEDIFF调用的顺序,我保证两个表达式产生积极结果。

如果它恰好在一个年龄段和另一个年龄段之间分开,上述情况会产生较低的年龄。如果你喜欢在这种情况下更高的年龄,只需将<换成<=即可。