2

基本的に、以下のアカウントの請求書明細があります。

BillID     AccountID     BilledFrom        BillTo      Days     Price
 38         3456         10/10/2012       10/11/2012    30       86p
 39         3456         11/11/2012       11/12/2012    30       87p
 40         3456         12/12/2012       30/12/2012    18       81p

ユーザーは一部の日付範囲について顧客に返金したいと考えているため、ユーザーは開始日と終了日を入力する必要があります。

Date From: 18/10/2012     DateTo: 14/12/2012

これにより、クレジットラインは、各ラインの日数と価格を計算してクライアントに返金します. 各行に戻り、カットオフ ポイントを表示する必要があります。ご覧のとおり、入力された範囲は 3 つの請求明細行にまたがっています。

必要な結果は次のとおりです。

BillID  AccountID  BilledFrom    BillTo     RangeStart  RangeEnd    Days  Price
 38       3456     10/10/2012   10/11/2012  18/10/2012  10/11/2012   22    86p
 39       3456     11/11/2012   11/12/2012  11/11/2012  11/12/2012   30    87p
 40       3456     12/12/2012   30/12/2012  11/11/2012  11/12/2012    2    81p

結果は基本的に最初の該当する請求明細行に戻りますが、この範囲がどのように適合するかを調べ、入力された日付範囲からの請求元と請求先に対して日数を計算します。

この結果を提供するには、SQLのいずれかで関数が必要です。任意のヘルプをいただければ幸いです。前もって感謝します。

4

2 に答える 2

3

これを試して:

  declare @DateFrom date='10/18/2012'     
 declare @DateTo date='12/14/2012'

 select T.BillID,T.AccountID,T.BilledFrom,T.BillTo,
     case when BilledFrom<@DateFrom then @DateFrom else BilledFrom end [RangeStart], 
     case when BillTo<@DateTo then BillTo else @DateTo end [RangeEnd],DATEDIFF(D,case when BilledFrom<@DateFrom then @DateFrom else BilledFrom end ,case when BillTo<@DateTo then BillTo else @DateTo end ) [Days],Price
     from t_account  T

SQLフィドルデモ

于 2012-07-27T09:38:33.063 に答える
2

純粋な T-SQL の回答は次のようになります (テキストで指定された列を持つ InvoiceLine という名前のテーブルを想定しています)。

declare @from datetime
declare @to datetime

set @from = '2012-10-18'
set @to = '2012-12-14'

select
    BillID, AccountID, BilledFrom, BillTo,
    case when datediff(d, @from, BilledFrom)>0 then BilledFrom else @from end [RangeStart],
    case when datediff(d, BillTo, @to)>0 then BillTo else @to end [RangeEnd],

    [days]
        +case when datediff(d, @from, BilledFrom)>0 then 0 else datediff(d, @from, BilledFrom) end
        +case when datediff(d, BillTo, @to)>0 then 0 else datediff(d, BillTo, @to) end [Days],
    Price
From InvoiceLine

ここでいくつかの仮定を行っていることに注意してください。

  1. 出力例の最後の行が間違っています。範囲は 12/12/2012 から 14/12/2012 です (例の日数は正しいですが (2))。

  2. このコードが機能するには、@from が @to より小さくなければなりませんが、いずれにせよそれを確認する必要があります。

  3. これを T-SQL で行う必要があります。これはあまりきれいではなく、C# の方がはるかに優れています (最小、最大メソッド、および日付操作)。

于 2012-07-27T09:49:12.553 に答える