6

次の 2 つの日付の差を計算する簡単な方法はありますか。

  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 年) です。

したがって、要約すると、上記の 2 つの例の出力 (DECIMAL(7,6)) は次のようになります。

1.000000 1.005479 0.997268

4

5 に答える 5

4

ここにクエリがあります。しかし、あなたの例には論理的なエラーがあります。「2011 年 3 月 1 日と 2012 年 3 月 3 日の差は 1.005479 (1 年 + 2/365 年)」 は (1 年 + 2/366 年) であると思います。昨年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)
于 2012-08-09T07:55:11.857 に答える
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
于 2012-08-09T08:33:06.623 に答える
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'

これがお役に立てば幸いです、ありがとうございます。

于 2012-08-09T07:17:03.603 に答える
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
于 2012-08-09T09:09:33.113 に答える