Wie Sie informiert wurden, können Sie in einer Funktion nicht definieren können, ein SP. Außerdem ist Ihre Funktion falsch. bei meiner Lösung suchen:
declare @d1 datetime, @d2 datetime, @year int, @month int, @d int
set @d1 = '2009-09-24'
set @d2 = '2012-04-23'
SET @year = NULLIF(DATEDIFF(year, @d1, @d2), 0)
IF @year IS NOT NULL AND DATEADD(year, @year, @d1) > @d2
SET @year = NULLIF(@year - 1, 0)
SET @month = NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(@year, 0), @d1), @d2), 0)
IF DATEADD(month, ISNULL(@month, 0), DATEADD(year, ISNULL(@year, 0), @d1)) > @d2
set @month = NULLIF(@month - 1, 0)
set @d = DATEDIFF(day, DATEADD(month, ISNULL(@month, 0), DATEADD(year, ISNULL(@year, 0), @d1)), @d2)
SELECT ISNULL(cast(@year as nvarchar) + ' year(s) ', '') + ISNULL(cast(@month as nvarchar) + ' month(s) and ', '') + cast(@d as nvarchar) + ' day(s)'
Anstatt eine Funktion verwenden Sie CASE
Aussage, aber meiner Meinung nach verwenden könnte, es sieht schrecklich aus:
SELECT
--Years
ISNULL(cast(
CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END
AS VARCHAR) + ' year(s) ', '')
--Months
+ ISNULL(cast(
CASE WHEN DATEADD(month, ISNULL(NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2), 0), 0), DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1)) > @d2
THEN NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2), 0)
END
AS VARCHAR) + ' month(s) ', '')
--Days
+ cast(DATEDIFF(day, DATEADD(month, ISNULL(CASE WHEN DATEADD(month, ISNULL(NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2), 0), 0), DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1)) > @d2
THEN NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(month, DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END, 0), @d1), @d2), 0)
END, 0), DATEADD(year, ISNULL(CASE WHEN DATEADD(year, ISNULL(NULLIF(DATEDIFF(year, @d1, @d2), 0), 0), @d1) > @d2
THEN NULLIF(DATEDIFF(year, @d1, @d2) - 1, 0)
ELSE NULLIF(DATEDIFF(year, @d1, @d2), 0)
END , 0), @d1)), @d2) as nvarchar) + ' day(s)'
Danke, aber Sie beantworten meine Frage nicht. Ich habe das schon gemacht, ich suche nach einer Möglichkeit, es inline zu machen, ohne eine andere Funktion zu definieren. – ron