1

この関数の適切な出力を取得しています。datediff は同じ月の日数の差のみを計算しますか? 「2015 年 1 月 1 日」の形式で日付を渡すと、常に 0 が返されます =/ ロジックまたは構文に何かミスがありましたか?

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
4

3 に答える 3

1

あなたの関数の正しい短いバージョンはこれだと思います-試してみてください:

CREATE FUNCTION dbo.CanPolicy
(
    @ReservationID int,
    @CancellationDate date
)
RETURNS smallmoney
AS
    BEGIN
        DECLARE @DepositPaid smallmoney,
                @CanceledDaysAhead int

        SELECT  @DepositPaid = ResDepositPaid,
                @CanceledDaysAhead = DATEDIFF(DAY,ResDate,@CancellationDate)
        FROM    Reservation
        WHERE   ReservationID = @ReservationID


        RETURN CAST(CASE WHEN @CanceledDaysAhead > 30 THEN 0 ELSE
               CASE WHEN @CanceledDaysAhead BETWEEN 14 AND 30 THEN @DepositPaid * 0.25 + 25 ELSE
               CASE WHEN @CanceledDaysAhead BETWEEN 8 AND 13 THEN @DepositPaid * 0.50 + 25 ELSE
               @DepositPaid END END END AS smallmoney)

    END
GO

主な問題はあなたのケースでした-いつブロックすると思います...

于 2015-07-09T07:40:45.697 に答える
0

あなたは今これを解決したかもしれませんが、+ または - の値である違いを気にせずに日付の違いを処理した 1 つの方法は、ABS を使用することです。

MSDN の ABS

このように、case ステートメントはそれらを区別する必要はありません。

于 2015-07-09T09:40:55.407 に答える