2012-08-09 51 views
5

有没有一种简单的方法来计算两个日期那之间的区别:日期差异(以年计)今年分数

  1. 它表达为年含的数量。年份;和
  2. 考虑闰年?

例如,2011年3月1日至2012年3月1日的差异为1年。但是,如果我使用DATEDIFF(day,..,..)并除以365,则由于闰年,我得到了一个(不希望的)1.00274的答案。

要清楚,我还需要任何年份(即不只是整年数)。例如,2011年3月1日至2012年3月3日的差异为1.005479(1年+ 2/365年)。 2011年3月1日至2012年2月29日的差异为0.997268(0年+ 365/366年)

总之,上述两个例子的输出(DECIMAL(7,6))为:

1.000000 1.005479 0.997268

+0

你能告诉我到底要作为输出什么在你上面的例子中? – AnandPhadke 2012-08-09 07:18:31

+0

也许这可能有所帮助:http://stackoverflow.com/questions/8882667/how-can-i-get-the-fraction-of-the-decimal-in-sql – Bridge 2012-08-09 07:29:20

+3

但是应该如何定义“年份” (就我所知,这不是一个众所周知的术语)?基于具体日期,您可能需要考虑一年366天而不是365天。预计2011年3月1日至2012年2月29日的差额预计为多少? – 2012-08-09 07:31:09

回答

0

试试这个,

SELECT Cast(DateDiff(yyyy, '2011-03-01', '2012-03-01') As VARCHAR) + 'Yer : ' 
+ Cast(DateDiff(mm, '2011-03-01', '2012-03-01') As VARCHAR) + 'Mon : ' 
+ Cast(DateDiff(dd, '2011-03-01', '2012-03-01') As VARCHAR) + 'Dte' 

希望这可以帮助你,谢谢你。

+0

谢谢,但它不是我所追求的。我应该在我的帖子中更加明确,我将编辑它。我想要任何年份以及整年的年份。 – PingPing 2012-08-09 07:19:55

4

这里是一个查询。但是在你的例子中有一个逻辑错误。我认为“2011年3月1日至2012年3月3日之间的差异为1.005479(1年+ 2/365年)”应为(1年+ 2/366年),因为2011年3月3日至2012年3月3日之间为29.02.2012去年366天。

Declare @BDate datetime 
    Declare @EDate datetime 
    SET @BDate='2011-03-01' 
    SET @EDate='2012-02-29' 

    select 

    datediff(year,@BDate,@Edate)- 
    case when dateadd(year,datediff(year,@BDate,@Edate),@BDate)>@Edate then 1 else 0 end 
    +cast(datediff(day,dateadd(year,datediff(year,@BDate,@Edate)- 
    case when dateadd(year,datediff(year,@BDate,@Edate),@BDate)>@Edate then 1 else 0 end ,@BDate),@Edate) as float)/ 
cast(datediff(day,dateadd(year,-1,@Edate),@Edate) as float) 
+0

大部分时间都可以使用,但在2011-12-31和2012-01-01期间失效。我注意到这个在upvoting – 2012-08-09 08:18:22

+0

谢谢。是的,我需要重新思考我的逻辑。 – PingPing 2012-08-09 08:20:53

+0

@ t-clausen.dk我已经解决了这个问题尝试新版本。 – valex 2012-08-09 08:43:48

3

我想这样的作品(我希望捡到的名字,你可以遵循):

declare @StartTime datetime 
declare @EndTime datetime 

select @StartTime = '20110301',@EndTime = '20120303' 

select YearsDiffNorm + ((DaysIntoYear * 1.0)/(DaysIntoYear + DaysRemainingInYear)) 
from (
select 
    YearsDiffNorm, 
    DATEDIFF(day,DATEADD(YEAR,YearsDiffNorm,@StartTime),@EndTime) as DaysIntoYear, 
    DATEDIFF(day,@EndTime,DATEADD(YEAR,YearsDiffNorm+1,@StartTime)) as DaysRemainingInYear 
from (
select CASE WHEN DATEADD(year,YearsDiff,@StartTime) > @EndTime then YearsDiff - 1 else YearsDiff END as YearsDiffNorm 
from (
    select DATEDIFF(year,@StartTime,@EndTime) as YearsDiff 
) t 
) t2 
) t3 
+0

+1为我测试的日期工作 – 2012-08-09 08:46:39

0

试试这个:

DECLARE @stdate datetime,@eddate datetime 
    SET @stdate='2007-02-01' 
    SET @eddate='2012-03-03' 

    ;WITH CTE as (
    select DATEDIFF(yy,@stdate,convert(datetime,cast(DATEPART(year,@eddate) as varchar)+'-'+cast(DATEPART(month,@stdate) as varchar)+'-'+cast(DATEPART(dd,@stdate) as varchar))) yrs, 
    DATEDIFF(dd,convert(datetime,cast(DATEPART(year,@eddate) as varchar)+'-'+cast(DATEPART(month,@stdate) as varchar)+'-'+cast(DATEPART(dd,@stdate) as varchar)),@eddate) as dayss, 
    CAST(CASE WHEN DATEPART(dd,DATEADD(mm,datediff(mm,-1,(convert(datetime,cast(DATEPART(year,@eddate) as varchar)+'-'+cast(DATEPART(month,@stdate) as varchar)+'-'+cast(DATEPART(dd,@stdate) as varchar)))),-1)) = 29 then 366 else 365 end as float) as ydays 
    ) 
    select yrs+dayss/cast(ydays as float) from CTE 
相关问题