Wie schreibe ich die YearFrac-Funktion, die mit Excel in Sql 2005 kommt?YearFrac in Sql 2005
5
A
Antwort
5
den Abstand zwischen zwei Terminen finden Sie DateDiff verwenden, und dann diesen Wert dividieren von 365
EDIT
Sie könnten natürlich auch Ihre eigene Funktion erstellen Sie den Job zu erledigen:
create function yearfrac (@d1 datetime, @d2 datetime) returns float
as
begin
return abs(datediff(d, @d1, @d2))/365.00
end
3
Für die Standardverwendung (zwei Datenparameter):
datediff(day, date1, date2)/360.0
Für den speziellen Fall, in dem der dritte Parameter den Wert 3:
datediff(day, date1, date2)/365.0
Edit:
Added eine Dezimalzahl es eine Gleitkomma-Operation zu machen.
+0
fyi, dies schneidet den Rückgabewert ab. –
-3
Ich weiß, dass dies ein wenig zu spät für eine Antwort ist aber nur für den Fall, dass jemand anderes stößt auf das hier ist das, was ich getan habe:
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
Verwandte Themen
- 1. PIVOT in Sql 2005
- 2. Sperrzeile in SQL 2005-2008
- 3. CSV in SQL Server 2005
- 4. SQL Server Enterprise Manager 2005 mit SQL Server 2005 Express
- 5. SQL 2005-Snapshot-Sicherheit
- 6. SQL Server 2005-Summierungsabfrage
- 7. SQL-Trigger 2005
- 8. SQL Server 2005 Datumslokalisierung
- 9. Sortierproblem - SQL Server 2005
- 10. SQL Server 2005 - Triggerschleife?
- 11. SQL Server 2005 xp_cmdshell
- 12. SQL Server 2005-Replikation
- 13. SQL Server 2005 Fehler
- 14. Ausgabeparameter SQL Server 2005
- 15. Sql Server 2005 Verbindungsprotokoll
- 16. SQL Server 2005 & Antivirensoftware
- 17. SQL Server 2005 Quellcodeverwaltung
- 18. SQL 2005 Rollback-Transaktion
- 19. SQL-Tabelle zu MDB (SQL 2005)
- 20. SQL Server 2008 zu SQL Server 2005
- 21. SQL-Abfrage, Wildcard, MS SQL Server 2005
- 22. SQL Server 2005 SQL-Authentifizierung Verbindungszeichenfolge
- 23. SQL 2005 Xml-Daten anzeigen
- 24. Temporäre SQL Server 2005-Tabellen
- 25. SQL Server 2005 und Oder
- 26. Abfragestatistiken für SQL Server 2005
- 27. SQL Server 2005: Transaktions-Deadlock
- 28. SQL 2005 SMO - Referenztabelle finden
- 29. SQL Server 2005: Nullable Fremdschlüsseleinschränkung
- 30. SQL 2005 Datenbank nicht zugänglich
, die nicht auf das Standardverhalten der YEARFRAC Funktion entspricht. .. – Guffa
@Guffa - guten Ruf, hatte den Unterschied nicht bemerkt. –
richtig du bist, guffa, ich habe das vermisst. in Ihrer Version müssten Sie jedoch etwas wie meine * 365.00 * -Lösung oben tun, um die Division mit Dezimalzahlen zu arbeiten, sonst enden Sie immer mit 0. –