This zombie thread keeps coming back to life! I'll throw in my contribution for SQL Server 2005 and later versions:
Code:
IF Object_Id('dbo.fDeltaYYMMDD') IS NOT NULL
DROP FUNCTION dbo.fDeltaYYMMDD
GO
-- ptp 20110107 Compute years, months, days since a date given in YYYYMMDD form
CREATE FUNCTION dbo.fDeltaYYMMDD(
@cDate VARCHAR(9)
) RETURNS @t TABLE (
OriginalDate VARCHAR(9)
, yy INT
, mm INT
, dd INT
) AS BEGIN
DECLARE
@d DATETIME
, @i INT
SET @d = Convert(DATETIME, @cDate, 112)
SET @i = DateDiff(month, @d, GetDate())
IF DateAdd(month, @i, @d) > GetDate()
SET @i = @i - 1
INSERT @t
SELECT @cDate, @i / 12, @i % 12, DateDiff(day
, DateAdd(month, @i, @d), GetDate())
RETURN
END
GO
-- Quick test of dbo.fDeltaYYMMDD
SELECT *
FROM (SELECT '20110106' AS d
UNION ALL SELECT '20101207'
UNION ALL SELECT '20100107'
UNION ALL SELECT '20100106'
UNION ALL SELECT '20100107'
UNION ALL SELECT '20100108'
UNION ALL SELECT '20091207'
UNION ALL SELECT '20091206'
) AS z
CROSS APPLY dbo.fDeltaYYMMDD(d)
GO
-PatP