2017-07-25 27 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調用的順序,我保證兩個表達式產生積極結果。

如果它恰好在一個年齡段和另一個年齡段之間分開,上述情況會產生較低的年齡。如果你喜歡在這種情況下更高的年齡,只需將<換成<=即可。