CREATE FUNCTION dbo.DATE_DIFF(@UNITE VARCHAR(16), @DT_BEGIN DATETIME2, @DT_END DATETIME2) RETURNS BIGINT AS BEGIN SET @UNITE = LOWER(@UNITE) -- trivial date's differences IF @UNITE = 'year' RETURN CAST(DATEDIFF(year, @DT_BEGIN, @DT_END) AS BIGINT); IF @UNITE = 'quarter' RETURN CAST(DATEDIFF(year, @DT_BEGIN, @DT_END) AS BIGINT); IF @UNITE = 'month' RETURN CAST(DATEDIFF(month, @DT_BEGIN, @DT_END) AS BIGINT); IF @UNITE = 'week' RETURN CAST(DATEDIFF(year, @DT_BEGIN, @DT_END) AS BIGINT); IF @UNITE = 'day' RETURN CAST(DATEDIFF(day, @DT_BEGIN, @DT_END) AS BIGINT); -- for smallest pieces of time use a BIGINT to calculate DIFF and begin to store days differences DECLARE @DATEDIFF BIGINT = DATEDIFF(day, @DT_BEGIN, @DT_END); DECLARE @h1 BIGINT = DATEPART(hour, @DT_BEGIN), @h2 BIGINT = DATEPART(hour, @DT_END), @m1 BIGINT = DATEPART(minute, @DT_BEGIN), @m2 BIGINT = DATEPART(minute, @DT_END), @s1 BIGINT = DATEPART(second, @DT_BEGIN), @s2 BIGINT = DATEPART(second, @DT_END), @ms1 BIGINT = DATEPART(millisecond, @DT_BEGIN), @ms2 BIGINT = DATEPART(millisecond, @DT_END), @ns1 BIGINT = DATEPART(nanosecond, @DT_BEGIN), @ns2 BIGINT = DATEPART(nanosecond, @DT_END), @µs1 BIGINT = DATEPART(microsecond, @DT_BEGIN), @µs2 BIGINT = DATEPART(microsecond, @DT_END); -- for hour, take @DATEDIFF (days) * 24 + differences between hours IF @UNITE = 'hour' RETURN @DATEDIFF * 24 + @h2 - @h1; -- for minute, take @DATEDIFF (days) * 24 * 60 + difference between hours * 60 + difference between minutes IF @UNITE = 'minute' RETURN @DATEDIFF * 1440 + 60 * (@h2 - @h1) + @m2 - @m1; -- and so on... IF @UNITE = 'second' RETURN @DATEDIFF * 86400 + 3600 * (@h2 - @h1) + 60 * (@m2 - @m1) + @s2 - @s1; IF @UNITE = 'millisecond' RETURN @DATEDIFF * 86400000 + 3600000 * (@h2 - @h1) + 60000 * (@m2 - @m1) + 1000 * (@s2 - @s1) + @ns1 - @ns2; IF @UNITE = 'microsecond' RETURN @DATEDIFF * 86400000000 + 3600000000 * (@h2 - @h1) + 60000000 * (@m2 - @m1) + 1000000 * (@s2 - @s1) + 1000 * (@ns1 - @ns2) + @µs2 - @µs1; RETURN @DATEDIFF; END; GO SELECT DATEDIFF_BIG (microsecond, '0001-01-01', '9999-12-31') SELECT dbo.DATE_DIFF('microsecond', '0001-01-01', '9999-12-31') DATEDIFF_BIG