YearFrac在SQL 2005年

如何编写Sql 2005中Excel附带的YearFrac函数?

使用DateDiff找出两个date之间的距离,然后将该值除以365

编辑

当然,您可以创build自己的function来完成这项工作:

create function yearfrac (@d1 datetime, @d2 datetime) returns float as begin return abs(datediff(d, @d1, @d2)) / 365.00 end 

对于默认使用情况(两个数据参数):

 datediff(day, date1, date2) / 360.0 

对于第三个参数的值为3的特殊情况:

 datediff(day, date1, date2) / 365.0 

编辑:
增加了一个小数,使其成为一个浮点运算。

我知道这是一个回应有点晚,但以防万一谁绊倒在这里这是我所做的:

 CREATE FUNCTION dbo.udfYearFrac ( @StartDate AS DATETIME, @EndDate AS DATETIME ) RETURNS DECIMAL(18,6) AS BEGIN DECLARE @YearFrac AS DECIMAL(18,6) DECLARE @nbDaysInPeriod AS INT DECLARE @nbYears AS INT SELECT @nbDaysInPeriod = DATEDIFF(DAY, @StartDate, @EndDate) ,@nbYears = YEAR(@EndDate) - YEAR(@StartDate) + 1 SELECT @YearFrac = @nbDaysInPeriod / CASE WHEN YEAR(@StartDate) = YEAR(@EndDate) OR (YEAR(@EndDate)-1 = YEAR(@StartDate) AND (MONTH(@StartDate) > MONTH(@EndDate) OR MONTH(@StartDate) = MONTH(@EndDate) AND (DAY(@StartDate) >= DAY(@EndDate)))) THEN CASE WHEN YEAR(@StartDate) = YEAR(@EndDate) AND ISDATE(CAST(YEAR(@StartDate) AS CHAR(4)) + '0229') = 1 THEN 366.0 ELSE CASE WHEN DAY(@EndDate) = 29 AND MONTH(@EndDate) = 2 THEN 366.0 ELSE CASE WHEN ISDATE(CAST(YEAR(@StartDate) AS CHAR(4)) + '0229') = 1 THEN CASE WHEN (@StartDate <= cast('2/29/' + cast(YEAR(@StartDate) AS CHAR(4)) AS DATETIME) AND cast('2/29/' + cast(YEAR(@StartDate) AS CHAR(4)) AS DATETIME) <= @EndDate) THEN 366.0 ELSE 365.0 END ELSE CASE WHEN ISDATE(CAST(YEAR(@EndDate) AS CHAR(4)) + '0229') = 1 THEN CASE WHEN (@StartDate <= cast('2/29/' + cast(YEAR(@EndDate) AS CHAR(4)) AS DATETIME) AND cast('2/29/' + cast(YEAR(@EndDate) AS CHAR(4)) AS DATETIME) <= @EndDate) THEN 366.0 ELSE 365.0 END ELSE 365.0 END END END END ELSE ((@nbYears * 365.0) + ( SELECT COUNT(*) FROM ( SELECT (ROW_NUMBER() OVER(ORDER BY TABLE_NAME ASC) - 1) * 4 + 1900 AS [YEAR] FROM INFORMATION_SCHEMA.COLUMNS ) yr WHERE [YEAR] BETWEEN YEAR(@StartDate) AND YEAR(@EndDate) ) ) / @nbYears END RETURN @YearFrac END