2014-10-20 99 views
-3

它为什么会返回负值?我传递的每一个价值都是积极的?但它确实返回负值?我尝试了每一个价值,每一个积极的但不返回正面的? 请帮助我,我想每一个东西为什么我的查询返回负值?

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 [email protected]_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 [email protected]_ID) 
           --DeparmentShiftsHistory.Shift_ID= @ShiftID) 

     Set @ShiftEndTime = (Select Cast(DeparmentShiftsHistory.EndTime as time) as EndTime from DeparmentShiftsHistory 
           where [email protected]_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 
+0

尝试打印的每个值,看哪个变量被生成-ve值 – 2014-10-20 15:45:39

+0

'声明@a日期时间= '20140101' 申报@b日期时间= '20120101' 选择DATEDIFF(分,@一个,@ b)中, DATEDIFF(MINUTE,@ b,@ a)' – bummi 2014-10-20 15:46:05

+0

检查DATEDIFF输入参数的顺序,看起来是错误的。如果你希望他们不管他们周围的方式,在'DATEDIFF()'周围放一个ABS() – 2014-10-20 15:47:24

回答

0

DATEDIFF将返回区别起积极或消极的,这取决于这些参数的顺序:

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

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

为了得到阳性值的第一个参数成为未成年人。