2011-02-14 99 views
2

我需要計算兩個日期之間的年份差異。真實年份datediff(無年份)

使用DATEDIFF但僅做日期的更小,例如嘗試:

Date 1: 07/03/2011 
Date 2: 07/02/2012 

(Date format MM/DD/YYYY) 

然後:DATEDIFF([YYYY],'07/03/2011' ,'07/02/2012' )= 1

但真正的差異是0年。

回答

1

由於沒有人有正確的解決方案,我張貼我的,即使沒有人會通知。

declare @d1 datetime 
declare @d2 datetime 

set @d1 = '1968-02-29' 
set @d2 = '2011-02-28' 

select datediff(year, @d1, @d2)- 
case when month(@d1)*32 + day(@d1) > month(@d2) * 32 + day(@d2) then 1 else 0 end 
--case when month(@d2)*32 + day(@d1) > month(@d2) * 32 + day(@d2) then 1 else 0 end 

這種方法基本上是一樣的下一個方法,不同的是它是用數字做是爲了避免鑄造,我被告知要慢。

select datediff(year, @d1, @d2)- 
case when convert(char(5),@d1, 1) > convert(char(5),@d2, 1) then 1 else 0 end 
0

是啊,DATEDIFF就是這樣用所有的日期部件工作,所以我猜你應該計算天數差,然後除以365(如果你不關心一天的時間)。 Si,試試這個:

DECLARE @StartDate DATETIME, @EndDate DATETIME 
SET @StarDate= '20110307' 
SET @EndDate = '20120207' 
SELECT DATEDIFF(DAY,@StartDate, @EndDate)/365 
+0

他會先確定一年中的天數。按照他的例子,2012年,365將無法工作。此外,他需要檢查他的包含日期是否包括閏年的2月29日。 – Matthew 2011-02-14 17:57:24

+0

不正確 - 結束2012-03-06,開始2011年3月7日結果= 1 – RichardTheKiwi 2011-02-14 19:03:36

1

如果您指定[yyyy],SQL Server只會執行一年差異。

對於DATEDIFF([yyyy], '07/03/2011', '12/31/2011')它將返回零。

對於DATEDIFF([yyyy], '07/03/2011', '01/01/2012')它將返回1.

在你的情況,如果你正在尋找365天或366天,你應該算日子:

DATEDIFF([dd], '07/03/2011', '07/02/2012')/366 
+1

越多年過去了,越不準確,因爲它一直持續366天,而一年可能有365/366 – RichardTheKiwi 2011-02-14 19:00:50

+0

當然,這就是爲什麼我曾說過「365或366」。如果您查看修訂歷史記錄,則可以看到它是365.然後,我將其更改爲JMira的示例數據的具體內容。我可以使用條件語句等提供完整的解決方案,但沒有時間... – 2011-02-14 19:48:19

2

這應該工作

declare @date1 datetime 
declare @date2 datetime 
select @date1 = '20110703', @date2 = '20120703' 

select case 
    when dateadd(yy, DATEDIFF(yy, @date1, @date2), @date1) > @date2 
    then DATEDIFF(yy, @date1, @date2) -1 
    else DATEDIFF(yy, @date1, @date2) end 

顯示許多邊緣條件的更全面的測試案例

create table dates(id int identity, date1 datetime, date2 datetime) 
insert dates select '20110703', '20120703' 
insert dates select '20110703', '20120702' 
insert dates select '20110702', '20120703' 
insert dates select '20110228', '20120228' 
insert dates select '20120229', '20130228' 
insert dates select '20120229', '20130301' 
insert dates select '20110301', '20120229' 
insert dates select '20120229', '20160301' 
insert dates select '20120229', '20160229' 
insert dates select '201', '20110101' 
insert dates select '20100101', '20111231' 

select date1, date2, 
    case 
    when dateadd(yy, DATEDIFF(yy, date1, date2), date1) > date2 
    then DATEDIFF(yy, date1, date2) -1 
    else DATEDIFF(yy, date1, date2) end 
from dates 
order by id