Sql 为什么我的查询返回负值?

Sql 为什么我的查询返回负值?,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,为什么它返回负值?我正在传递每一个正值?但它会返回负值吗?我尝试了每一个值,每一个都是正数,但没有返回正数? 请帮帮我,我什么都试过了 ALTER FUNCTION [dbo].[GetShiftTotalDurationForDays] ( @DepartmentShiftHistory_ID int, @FromDate DateTime, @ToDate DateTime, @UserID int ) RETURNS int AS BEGIN

为什么它返回负值?我正在传递每一个正值?但它会返回负值吗?我尝试了每一个值,每一个都是正数,但没有返回正数? 请帮帮我,我什么都试过了

ALTER FUNCTION [dbo].[GetShiftTotalDurationForDays]
(
     @DepartmentShiftHistory_ID int,
     @FromDate DateTime,
     @ToDate DateTime,
     @UserID int 

)
RETURNS int
AS
BEGIN


    Declare @TotalShiftHolidays int
    Declare @TotalGazetted int
    Declare @TotalLeaves int
    Declare @SumOfHolidays int
    Declare @TotalDays int
    --Declare @TrimmedAttendanceDate varchar(7)
    Declare @TrimmedFromDate varchar(7)
    Declare @TrimmedToDate varchar(7)

    Declare @ShifTimeDifference int
    Declare @ShiftStartTime time
    Declare @ShiftEndTime time
    Declare @ShiftTimeForTotalDays int

    Declare @ShiftID int
    set  @ShiftID= (select Shift_ID From DeparmentShiftsHistory Where DepartmentShiftHistoryID=@DepartmentShiftHistory_ID)


    --  Set @TrimmedAttendanceDate = (Select CONVERT(Varchar(7), Attendance.AttendanceDate, 113) from Attendance)

        Set @TrimmedFromDate = (Select CONVERT(Varchar(7), @FromDate , 113))
        Set @TrimmedToDate = (Select CONVERT(Varchar(7), @ToDate, 113))

        Set @TotalShiftHolidays= (Select Count(*) from dbo.Attendance 
                                  where IsShiftHoliday=1 AND AttendanceDate >= @FromDate 
                                  AND AttendanceDate < dateadd(day,1,@ToDate)) 
                                  --AND User_ID= @UserID )

        Set @TotalGazetted = (Select Count(*) from dbo.Attendance 
                                  where IsGazettedHoliday=1 
                                  AND datepart(year,@FromDate) = datepart(year,AttendanceDate))
                                  -- @TrimmedAttendanceDate >= @TrimmedFromDate 
                                  --AND @TrimmedAttendanceDate <= @TrimmedToDate

                                 --   AND User_ID= @UserID)

        Set @TotalLeaves= (Select Count(*) from dbo.Attendance 
                                  where IsLeaveHoliday=1 AND AttendanceDate >= @FromDate 
                                  AND AttendanceDate <dateadd(day,1,@ToDate)  AND User_ID= @UserID )

        Set @SumOfHolidays = (@TotalShiftHolidays + @TotalGazetted + @TotalLeaves)

        Set @TotalDays = (Select DATEDIFF(dd, @FromDate, @ToDate)) - @SumOfHolidays --Exlcuding holidays


        Set @ShiftStartTime = (Select Cast(DeparmentShiftsHistory.StartTime as time) as StartTime from DeparmentShiftsHistory 
                               where DepartmentShiftHistoryID=@DepartmentShiftHistory_ID)
                               --DeparmentShiftsHistory.Shift_ID= @ShiftID )

        Set @ShiftEndTime = (Select Cast(DeparmentShiftsHistory.EndTime as time) as EndTime  from DeparmentShiftsHistory
                               where DepartmentShiftHistoryID=@DepartmentShiftHistory_ID)
                               -- DeparmentShiftsHistory.Shift_ID= @ShiftID )

        Set @ShifTimeDifference = (Select DATEDIFF(minute,@ShiftEndTime,@ShiftStartTime)) --Returns time difference in Minutes

        Set @ShiftTimeForTotalDays = @ShifTimeDifference * @TotalDays


    RETURN @ShiftTimeForTotalDays  -- //Total Shift Timmings BetWeennn Dates in Minutes


END

DATEDIFF将根据参数的顺序返回差分posive或负值:

Declare @a datetime='20140101'
Declare @b datetime='20120101'

Select DATEDIFF(MINUTE,@a,@b),DATEDIFF(MINUTE,@b,@a)

要获得正值,第一个参数必须是次参数。

尝试打印每个值,看看哪个变量正在生成-ve valueDeclare@a datetime='20140101'Declare@b datetime='20120101'选择DATEDIFFMINUTE,@a,@b,DATEDIFFMINUTE,@b,@a检查DATEDIFF输入参数的顺序,它们似乎是错误的。如果你想让他们不管走哪条路,在DATEDIFF周围放一个腹肌