【发布时间】:2015-07-09 07:15:38
【问题描述】:
我得到了这个函数的正确输出。 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
【问题讨论】:
-
你说
@CancellationDate = 01 Jan 2015时出错,请指定ResDate的值,用于计算.. -
不知道测试场景的所有参数,但是我觉得datediff参数需要切换:
DATEDIFF(day, @CancellationDate, @ResDate)否则如果cancellationdate在reservationdate之前,datediff会一直返回负值,使得case结果不正确。 -
另外附注,您可以一次性获得预付和重订日期:
SELECT @DepositPaid = ResDepositPaid, @ResDate = ResDate FROM Reservation WHERE ReservationID = @ReservationID -
@Me.Name Jake 所做的是正确的,因为
Select语句是非标准的赋值语句。如果给定的ReservationID有两个ResDate,那么通过Select进行分配不会引发任何错误,并且只会分配两个限定值中的任何一个。虽然通过Set分配会引发错误,因此我们可以确定应该选择两个ResDate。 -
@Me.Name,不错的收获! DATEDIFF 中的值的切换做到了。看起来我需要仔细检查我的阅读,阅读 DATEDIFF 的文档是我做的第一件事,我发誓它是从左边减去右边的值,而不是从右边减去左边的值。
标签: sql sql-server tsql datediff udf