Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing DATEDIFF interval as user defined function argument?

I want to write a function to return datediff ignoring weekends on SQL Server. Is it allowed to pass interval as an argument on my user defined function, as following? SQL Server is saying "Invalid parameter 1 specified for datediff."

CREATE FUNCTION [dbo].[DATEDIFFWD](@interval varchar(2), @ini datetime, @end datetime)
RETURNS int
AS
BEGIN
    DECLARE @output int
    SET @output = DATEDIFF(@interval, @ini, @end)
    IF (@interval = 'hh') SET @output = @output - (DATEDIFF(WK, @ini, @end) * 48)
    IF (@interval = 'dd') SET @output = @output - (DATEDIFF(WK, @ini, @end) * 2)
    RETURN @output
END
like image 444
fcaserio Avatar asked May 19 '26 07:05

fcaserio


1 Answers

You could rewrite it as:

CREATE FUNCTION [dbo].[DATEDIFFWD](@interval varchar(2),
                                   @ini datetime, @end datetime)
RETURNS int
AS
BEGIN
    RETURN (SELECT CASE @interval 
      WHEN 'hh' THEN DATEDIFF(hh, @ini, @end) - ((DATEDIFF(WK, @ini, @end) * 48))
      WHEN 'dd' THEN DATEDIFF(dd, @ini, @end) - ((DATEDIFF(WK, @ini, @end) * 2))
    END
    );
END

Please note that scalar function could be inlined starting from SQL Server 2019

db<>fiddle demo

For better performance I would use table function instead:

CREATE FUNCTION [dbo].[DATEDIFFWD](@interval varchar(2),
                                   @ini datetime, @end datetime)
RETURNS TABLE
AS
RETURN (
    SELECT CASE @interval 
     WHEN 'hh' THEN DATEDIFF(hh, @ini, @end) - ((DATEDIFF(WK, @ini, @end) * 48))
     WHEN 'dd' THEN DATEDIFF(dd, @ini, @end) - ((DATEDIFF(WK, @ini, @end) * 2))
    END AS r
);
like image 82
Lukasz Szozda Avatar answered May 22 '26 01:05

Lukasz Szozda



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!