大家好,我有一个任务,我必须计算多个日期范围内的价格,而我仍然坚持如何做。
我有查询返回一组日期范围和每个愤怒的价格 范围是连续的,是英国的日期和时间。货币
FromDate ToDate PricePerDay
01/05/2013 06/05/2013 £7
07/05/2013 20/05/2013 £12
查询有2个参数: @date - 这是客户想要培训的一天。 @NumberOfDays - 这是天数。
现在,如果客户提交@date = 02/05/2013和NumberOfDays = 2的数量 查询将只返回第一行,并且相当容易读回数据,并说好总价格将是2x£7。
但是如果客户提交@date = 04/05/2013并且NumberOfDays = 7 那么它将返回上面的两行,我将按如下方式计算
3天@ 7英镑和4天@ 12英镑,因为客户选择的日期跨越两个范围。
我必须在VB.net类(业务逻辑类)公司策略中执行此操作,该数据库仅作为存储,不应定义业务规则。
任何帮助或提示都将受到赞赏。
杰森
答案 0 :(得分:2)
这是SQL(SQL Server)中的答案
为了方便我使用sqlfiddle,我把它写成了一个存储过程。您可以将SQL嵌入到VB.Net clas中。
它的工作原理是挑选出指定日期范围内的行(我想你已经弄明白了)。然后,如果需要,它会截断每个范围以适合指定的范围。最后,计算每个截断范围中的天数,乘以该范围的成本,然后将它们全部加起来。
Create Table Rates (
FromDate datetime,
ToDate datetime,
PricePerDay money
);
Insert Into Rates (FromDate, ToDate, PricePerDay) Values
('2013-05-01', '2013-05-06', 7),
('2013-05-07', '2013-05-20', 12);
GO
Create Procedure Cost(@FromDate datetime, @Days int) As
Declare @ToDate date
Set @ToDate = DateAdd(Day, @Days, @FromDate)
Select
Sum(DateDiff(Day, FromDate, ToDate) * PricePerDay) As TotalCost
From (
Select
Case When @FromDate > FromDate Then @FromDate Else FromDate End As FromDate,
Case When @ToDate < DateAdd(Day, 1, ToDate) Then @ToDate Else DateAdd(Day, 1, ToDate) End As ToDate,
PricePerDay
From
Rates
Where
FromDate < @ToDate And
ToDate > @FromDate
) X
GO
exec Cost '2013-05-02', 2
GO
exec Cost '2013-05-04', 7