Search code examples
sqlsql-servert-sqldatediffudf

Trouble with TSQL calculation - date diff giving me troubles


I am having getting proper outputs for this functions. Does datediff only calculate the difference in days for days in the same month? When I pass in a date in the form of '01 Jan 2015' it always sends me back a 0 =/ did I miss something in my logic or syntax?

CREATE FUNCTION dbo.CanPolicy
(
    @ReservationID int,
    @CancellationDate date
)
RETURNS smallmoney
AS
    BEGIN
        DECLARE @DepositPaid smallmoney
        SET @DepositPaid = (SELECT ResDepositPaid
                            FROM Reservation
                            WHERE ReservationID = @ReservationID)
        DECLARE @ResDate date
        SET @ResDate = (SELECT ResDate
                        FROM Reservation
                        WHERE ReservationID = @ReservationID)
        DECLARE @CanceledDaysAhead int
        SET @CanceledDaysAhead = DATEDIFF(day, @ResDate, @CancellationDate)
        DECLARE @result smallmoney
        SET @result = 0
        SET @result = CASE WHEN @CanceledDaysAhead > 30 THEN 0
                        WHEN @CanceledDaysAhead BETWEEN 14 AND 30 THEN @DepositPaid * 0.25 + 25
                        WHEN @CanceledDaysAhead BETWEEN 8 AND 13 THEN @DepositPaid * 0.50 + 25
                        ELSE @DepositPaid
                    END
        RETURN @result
    END

GO

Solution

  • No, DATEDIFF counts dates in between. Try:

    SELECT DATEDIFF(day,{ts'2105-01-01 00:00:00'},{ts'2105-04-01 00:00:00'})
    

    Could be a date format issue...

    Are you sure, that @ResDate is set correctly?

    EDIT: New approach with CTE

    DECLARE @ReservationID INT=123;
    DECLARE @CancelationDate DATE=GETDATE();
    
    WITH ReservationCTE AS
    (
        SELECT ResDepositPaid 
              ,ResDate
        FROM Reservation
        WHERE ReservationID=@ReservationID --assuming that ReservationID is a unique key!
    )
    ,ReservationCTEWithDateDiff AS
    (
        SELECT ReservationCTE.*
              --EDIT: switched dates due to a comment by Me.Name
              ,DATEDIFF(DAY,@CancelationDate,ResDate) AS CanceledDaysAhead
        FROM ReservationCTE
    )
    SELECT CASE WHEN CanceledDaysAhead>30 THEN 0
                WHEN CanceledDaysAhead BETWEEN 14 AND 30 THEN ResDepositPaid * 0.25 + 25
                WHEN CanceledDaysAhead BETWEEN 8 AND 13 THEN ResDepositPaid * 0.50 + 25
                ELSE ResDepositPaid END AS MyReturnValue
    FROM ReservationCTEWithDateDiff