真的年鉴(没有年份)

时间:2011-02-14 17:44:48

标签: sql sql-server tsql

我需要计算两个日期之间的年差异。

尝试使用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年。

5 个答案:

答案 0 :(得分: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 '20101231', '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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

在回顾了问题并回答了一些问题后,我所提供的只是一些联系:http://msdn.microsoft.com/en-us/library/ms189794.aspx

答案 4 :(得分:0)

是的,DATEDIFF以这种方式对所有日期部分起作用,所以我猜你应该计算天数的差异,然后除以365(如果你不关心一天中的时间,这就是这个)。 Si,试试这个:

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