У меня есть правильные выходы для этих функций. Рассчитывает ли датифик только разницу дней в днях в том же месяце? Когда я перехожу в дате в форме '01 января 2015 года, она всегда посылает мне обратно 0 =/я пропустил что-то в своей логике или синтаксисе?Неисправность при расчете TSQL-date diff дает мне неприятности
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
Вы сказали, что получаете ошибку, когда '@CancellationDate = 01 января 2015', пожалуйста, укажите значение' ResDate', которое используется в расчете .. – Deepshikha
Не знаю всех параметров тестового сценария, но я думаю параметры датированного параметра необходимо переключить: 'DATEDIFF (день, @CancellationDate, @ResDate)' В противном случае, если датой отмены является до момента резервирования, lateiff всегда будет возвращать отрицательное значение, делая неверные результаты «case». –
Кроме того, вы можете получить depostipaid и resdate за один раз: 'SELECT @DepositPaid = ResDepositPaid, @ResDate = ResDate FROM Reservation WHERE ReservationID = @ ReservationID' –