¿Cómo escribo la función YearFrac que viene con Excel en Sql 2005?YearFrac en Sql 2005
5
A
Respuesta
5
averiguar la distancia entre dos fechas utilizando DateDiff, y luego dividir ese valor por 365
EDITAR
Se podría, por supuesto, crear su propia función para hacer el trabajo:
create function yearfrac (@d1 datetime, @d2 datetime) returns float
as
begin
return abs(datediff(d, @d1, @d2))/365.00
end
3
Para el uso predeterminado (dos parámetros de datos):
datediff(day, date1, date2)/360.0
Para el caso especial en el que el tercer parámetro tiene el valor 3:
datediff(day, date1, date2)/365.0
Editar:
añadido un decimal para que sea una operación de punto flotante.
+0
fyi, esto trunca el valor de retorno. –
-3
Sé que esto es un poco tarde de una respuesta, pero sólo en caso de que alguien se tropieza demás sobre esto aquí es lo que he hecho:
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
Cuestiones relacionadas
- 1. PIVOT en SQL 2005
- 2. Isoweek en SQL Server 2005
- 3. SQL Server 2005 replicación
- 4. SQL Server 2008 a SQL Server 2005
- 5. Bloquear fila en SQL 2005-2008
- 6. Editar sinónimos en MS SQL Server 2005
- 7. Consultas jerárquicas en SQL Server 2005
- 8. Indexar varchar en MS SQL Server 2005
- 9. subconsultas en UPDATE SET (sql server 2005)
- 10. TransactionInDoubtException usando System.Transactions en SQL Server 2005
- 11. ¿Dinámicamente nombrar índices en SQL Server 2005?
- 12. unen tres tablas en SQL Server 2005
- 13. UPSERT atómico en SQL Server 2005
- 14. Números persas en SQL Server 2005
- 15. instrucción IIF en SQL Server 2005
- 16. Concatene ntext en SQL Server 2005
- 17. SQL Server 2005: interbloqueo de transacción
- 18. Acceda a TimeZoneInfo desde SQL 2005 Server
- 19. servidor SQL Integration Services 2008-2005 compatibilidad
- 20. sql server 2005 - exportar datos nvarchar (max)
- 21. SQL Server 2005 - Orden de combinaciones internas
- 22. SQL 2005 Express Edition - Instalar nueva instancia
- 23. SQL Server 2005 Error 701 - sin memoria
- 24. SQL Server 2005 pérdida de precisión numérica
- 25. SQL Server 2005 ROW_NUMBER() sin ORDER BY
- 26. SQL Server 2005: ¿Por qué nombrar transacciones?
- 27. SQL Express 2005/2008 Concurrent Connections
- 28. Intercalación de clientes y SQL Server 2005
- 29. Restaurar SQL Server 2008 DB * a * SQL Server 2005
- 30. Soporte de código SMO para sql 2005 y sql 2008
que no se corresponde con el comportamiento por defecto de la función YEARFRAC. .. – Guffa
@Guffa - buena llamada, no había notado la diferencia. –
, lo tienes, guffa, me lo perdí. en su versión, sin embargo, tendría que hacer algo como mi solución * 365.00 * arriba, para forzar a la división a trabajar con decimales, de lo contrario siempre terminará con 0. –