TSQL рекурсия функции - PullRequest
       0

TSQL рекурсия функции

2 голосов
/ 20 января 2011

У меня есть это:

CREATE FUNCTION [dbo].[udf_SLA_AdjustDateTimeForBusinessHours]
(
    @DateTime DateTime
)
RETURNS DateTime
AS
BEGIN

    DECLARE @AdjustedDate DateTime;

    If dbo.udf_SLA_IsBusinessDay(@DateTime) = 1 
    BEGIN
        IF dbo.udf_SLA_IsWithinBusinessHours(@DateTime) = 1
            SET @AdjustedDate = @DateTime
        Else
        BEGIN
            IF dbo.udf_TimeOnly(@DateTime) < dbo.udf_Time(8,0,0)
                SET @AdjustedDate = dbo.udf_DateOnly(@DateTime) + dbo.udf_Time(8, 0, 0) 
            ELSE
                SET @AdjustedDate = dbo.udf_SLA_AdjustDateTimeForBusinessHours(dbo.udf_DateOnly(@DateTime) + 1 + dbo.udf_Time(8, 0, 0))
        END
    END
    RETURN @AdjustedDate
END

Это интересная часть:

SET @AdjustedDate = dbo.udf_SLA_AdjustDateTimeForBusinessHours(dbo.udf_DateOnly(@DateTime) + 1 + dbo.udf_Time(8, 0, 0))

Я хочу вызвать функцию из самой функции. Как и сейчас, все, что я получаю, это NULL при выполнении этой ветви кода. Это где используется CTE?

udf_SLA_IsBusinessDay и udf_SLA_IsWithinBusinessHours говорят сами за себя. udf_DateOnly, udf_TimeOnly, udf_Time и т. д. происходят из здесь .

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Я думаю, что вы упускаете условие ELSE, когда оно не в рабочий день. Эта функция предназначена для бизнес-логики, к которой вы стремитесь.

Я также внес изменения в dbo.udf_Time(8, 0, 0), чтобы он был просто '08:00', который работает без функции.

CREATE FUNCTION [dbo].[udf_SLA_AdjustDateTimeForBusinessHours]
(
    @DateTime DateTime
)
RETURNS DateTime
AS
BEGIN
    DECLARE @AdjustedDate DateTime;

    If dbo.udf_SLA_IsBusinessDay(@DateTime) = 1 
    BEGIN
        IF dbo.udf_SLA_IsWithinBusinessHours(@DateTime) = 1
            SET @AdjustedDate = @DateTime
        Else IF dbo.udf_TimeOnly(@DateTime) < '08:00'
            SET @AdjustedDate = dbo.udf_DateOnly(@DateTime) + '08:00'
        ELSE
            SET @AdjustedDate = dbo.udf_SLA_AdjustDateTimeForBusinessHours(
                dbo.udf_DateOnly(@DateTime) + 1 + '08:00')
    END
    ELSE
        SET @AdjustedDate = dbo.udf_SLA_AdjustDateTimeForBusinessHours(dbo.udf_DateOnly(@DateTime)+1+'08:00')
    RETURN @AdjustedDate
END
GO

Если я могу вмешаться, функция udf_DateOnly может быть проще

CREATE function dbo.udf_DateOnly(@d datetime) returns datetime as
begin
    return datediff(d,0,@d)
end
1 голос
/ 16 декабря 2013

Функция dateonly может быть еще проще.Попробуйте это:

CAST(@d AS DATE)

Таким образом, вы разыгрываете извлечение части даты из значения даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...