跨日期范围计算

时间:2013-05-11 00:04:43

标签: asp.net sql vb.net date

大家好,我有一个任务,我必须计算多个日期范围内的价格,而我仍然坚持如何做。

我有查询返回一组日期范围和每个愤怒的价格 范围是连续的,是英国的日期和时间。货币

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类(业务逻辑类)公司策略中执行此操作,该数据库仅作为存储,不应定义业务规则。

任何帮助或提示都将受到赞赏。

杰森

1 个答案:

答案 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