0

こんにちは、私は複数の日付範囲にわたって価格を計算する必要があるタスクを持っています。

一連の日付範囲と各怒りの価格を返すクエリがあります。範囲は連続しており、英国の日付と通貨です

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 を送信すると、クエリは最初の行のみを返し、データを読み戻して OK と言うのはかなり簡単で、合計金額は 2x£7 になります。

しかし、クライアントが @date = 04/05/2013 と NumberOfDays = 7 を送信すると、上記の両方の行が返され、次のように計算する必要があります。

クライアントが選択した日付が両方の範囲をまたぐため、3 日間 @ £7 と 4 日間 @ £12 です。

DBはストレージのみであり、ビジネスルールを定義してはならないというVB.netクラス(ビジネスロジッククラス)の会社ポリシーでこれを行う必要があります。

これに関するヘルプやヒントをいただければ幸いです。

ジェイソン

4

1 に答える 1

2

Here's an answer in SQL (SQL Server)

I've written it as a stored procedure for my convenience in using sqlfiddle. You could embed the SQL in a VB.Net clas instead.

It works by picking out rows that are in the specified date range (I think you already have this bit figured out). It then truncates each range if necessary to fit in the specified range. Finally it works out how many days are in each of the truncated ranges, multiplies by the cost for that range and then adds them all up.

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
于 2013-05-11T00:41:16.373 に答える