Передача интервала DATEDIFF в качестве аргумента пользовательской функции? - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу написать функцию, которая будет возвращать дату без учета выходных на SQL Server.Разрешено ли передавать интервал в качестве аргумента моей пользовательской функции следующим образом?SQL Server говорит «Недопустимый параметр 1, указанный для 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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете переписать его как:

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

Обратите внимание, что скалярная функция может быть встроена, начиная с SQL Server 2019

дБ<> fiddle demo

Для лучшей производительности я бы вместо этого использовал табличную функцию:

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
);
0 голосов
/ 20 декабря 2018

DATEDIFF не будет принимать пользовательские эквиваленты переменных для DATEPART.Вам придется объединить это в динамическом SQL или использовать другую логику, чтобы отделить эту переменную за пределами DATEDIFF.Кроме того, я бы не стал использовать varchar(2) на @interval в основном потому, что это плохая привычка, которую следует бросить. .

...