1

我想了解在调用括号中的 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语句。

提前致谢 :)

4

3 回答 3

5

这是 TSQL一元负运算符

返回数值表达式(一元运算符)的负数。一元运算符仅对数字数据类型类别的任何一种数据类型的一个表达式执行操作。

于 2019-04-02T13:45:25.170 回答
1

它是一元否定运算符,因此与 相同(0 - <expression>)

也就是说,我猜这更简单地表示为:

RETURN ABS(dbo.FullWeekDays(@StartDate, @EndDate) - @nonworkingweekdays)
于 2019-04-02T14:23:01.800 回答
0

连字符用于反转表达式值的符号,因为在这种情况下:

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

您将返回日期之间的差减去nonworkingdays变量。

这在逻辑上是最好的选择,因为你不能有 -1 天的差异,你总是需要一个正整数作为差异。

一定要设法区分返回的类型(当startdate大于时enddate,反之亦然)

于 2019-04-02T13:58:07.253 回答