Как использовать дефис перед функцией в SQL (SQLServer) - PullRequest
1 голос
/ 02 апреля 2019

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

Вот SQL:

IF (@StartDate > @EndDate)
BEGIN
    SET @EndDate = @StartDate
    SET @StartDate = @EndDate
END

DECLARE @nonworkingweekdays int

--now deal with public holidays
SELECT @nonworkingweekdays = count("Date") from 
(
    select distinct
    (
    CASE datepart(weekday,date)
            WHEN 1 THEN null --ignore sundays   
            WHEN 7 THEN null --ignore saturdays
            else "Date"
    END
    ) AS "date" 
    from publicholidays
) nonworkingweekdays 
WHERE 
"Date" is not null and 
"Date" between @StartDate and DATEADD(day, -1, @EndDate)

RETURN
    CASE WHEN @StartDate <= @EndDate
    THEN
        dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays
    ELSE
        -(dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays)
    END 

Логика, в которой я запутался, заключается в операторе else с оператором return в нижней части этого скрипта.

Заранее спасибо :)

Ответы [ 3 ]

5 голосов
/ 02 апреля 2019

Это унарный отрицательный оператор TSQL :

Возвращает отрицательное значение числового выражения (унарный оператор).Унарные операторы выполняют операцию только с одним выражением любого из типов данных категории числовых типов данных.

1 голос
/ 02 апреля 2019

Это унарный оператор отрицания, такой же, как (0 - <expression>).

Тем не менее, я предполагаю, что это проще выразить как:

RETURN ABS(dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays)
0 голосов
/ 02 апреля 2019

Дефис используется для изменения знака значения выражения, потому что в том случае, если у вас есть:

CASE WHEN @StartDate <= @EndDate
THEN
    dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays
ELSE
    -(dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays)
END 

вы возвращаете разницу между датами за вычетом переменной nonworkingdays.

это логически лучший вариант, потому что вы не можете иметь разницу в -1 дней, вам всегда нужно положительное целое число в разнице.

обязательно сделайте способ различать типы возврата (когда startdate больше enddate и наоборот)

...