Come si scrive la funzione YearFrac fornita con Excel in Sql 2005?YearFrac in SQL 2005
5
A
risposta
5
scoprire la distanza tra due date utilizzando DateDiff, e poi dividere tale valore per 365
EDIT
Si potrebbe, ovviamente, creare la propria funzione per fare il lavoro:
create function yearfrac (@d1 datetime, @d2 datetime) returns float
as
begin
return abs(datediff(d, @d1, @d2))/365.00
end
3
Per l'uso di default (due parametri dati):
datediff(day, date1, date2)/360.0
Per il caso particolare in cui il terzo parametro ha il valore 3:
datediff(day, date1, date2)/365.0
Edit:
aggiunto un decimale, un'operazione in virgola mobile.
+0
fyi, questo tronca il valore di ritorno. –
-3
So che questo è un po 'in ritardo di una risposta, ma solo nel caso in cui qualcuno inciampa altro su questo qui è quello che ho fatto:
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
che non corrisponde al comportamento predefinito della funzione YEARFRAC. .. – Guffa
@Guffa - buona chiamata, non aveva notato la differenza. –
proprio così, guffa, mi mancava quello. nella tua versione, però, dovresti fare qualcosa come la mia soluzione * 365,00 * sopra, per forzare la divisione a lavorare con i decimali, altrimenti finirai sempre con 0. –