2012-02-27 5 views
0

テーブル価格期間tblPricePeriod私はAmountを特定のアパートメントの2つの日付の間に請求することがあります。価格期間テーブルから金額を取得

ApartmentIdの価格期間には、StartDateEndDateのカラムもあります。以下は

は、私のテーブルの構造である:

enter image description here

今私は予約の日のために合計金額を請求する計算します。誰かが4febから2月7日に留まる場合例えば

は、その後、彼は以下のスキームに従って支払う必要があります。私は、パラメータとしてstartdateenddateapartmentidを持って

4-  10 
5-  10 
6-  10 
7 -  nothing as this is checkout date 
----------------------------------------------------- 
totamt--- 30$ 

、私は、MSのアクセスDBを使用しています。

私はこれをトラバースするためにC#コードをフォローコードで使用していますが、成功していません。

すべての日付の金額を1つずつ取得し、1つのグローバル変数に追加しています。次のように

コードは次のとおりです。ここで

decimal amount = 0; 

// loop to traverse all days between start date and end date 
for (DateTime d = Convert.ToDateTime(StartDate); d < Convert.ToDateTime(EndDate); d = d.AddDays(1)) 
{ 
    string priceCalc = "select Amount from tblPricePeriod where ApartmentId=" + ApartmenId + " and cdate(StartDate) <='" + d.ToShortDateString() + "' and cdate(EndDate) >= '" + d.ToShortDateString() + "'"; 
    DataSet dsPriceCalc = SqlHelper.ExecuteDataset(Connection.ConnectionString, CommandType.Text, priceCalc); 
    if (dsPriceCalc.Tables[0].Rows.Count > 0) 
    { 
     amount = amount + Convert.ToDecimal(dsPriceCalc.Tables[0].Rows[0]["Amount"]); 
    } 
} 
+0

問題は何か分かりませんか?間違いや合計が間違っていますか?また、顧客がチェックアウト日に支払うことを望まない場合は、チェックアウト日に '> = 'の代わりに'> 'を使用する必要があります。 – Niklas

+0

間違ったシミュレーションクエリからデータが来ておらず、ゼロのままである – rahularyansharma

+1

これらの 'StartDate'列と 'EndDate'列は、 '日付'型ですか? Accessに日付の区切り文字が必要なの? –

答えて

1

は、SQLのSUM関数の例です:

SELECT SUM(salary) as "Total Salary" 
FROM employees 
WHERE salary > 25000; 

// EDIT:

の代わりにあなたをループ日付の合計金額を直接選択することができます:

DateTime dtStartDate = Convert.ToDateTime(StartDate); 
DateTime dtEndDate = Convert.ToDateTime(EndDate); // maybe -1 day 

string priceCalc = "select SUM(Amount) from tblPricePeriod where ApartmentId=" + ApartmenId + " and cdate(StartDate) <= '" + dtStartDate.ToShortDateString() + "' and cDate(EndDate) >= '" + dtEndDate.ToShortDateString() + "'"; 
+0

あなたは、私のためにsum関数がどのように機能するか教えてください。 – rahularyansharma

+1

@ViperのSQL文は正しい結果を得ることができません。 –

+0

@Viper Thitは、startDate/EndDateのレコードが複数ある場合、すべてのレコードを取得します。 – Ravia

0

あなたは完全にSQLアプローチを採用できます。アクセスが、私は、クエリに注釈を付けることができneenていませんでしたコメントを許可していませんので

SELECT SUM(TotalAmount) AS Amount 
FROM ( SELECT Amount * (1 + DATEDIFF('d', @StartDate, EndDate)) AS TotalAmount, 
        (1 + DATEDIFF('d', @StartDate, EndDate)) AS Days, 
        Amount AS DailyRate 
      FROM tblPricePeriod 
      WHERE @StartDate >= StartDate 
      AND  @StartDate <= EndDate 
      AND  @EndDate > EndDate 
      AND  ApartmentID = @ApartmentID 
      UNION ALL 
      SELECT Amount * (DATEDIFF('d', @StartDate, @EndDate)), DATEDIFF('d', @StartDate, @EndDate), Amount 
      FROM tblPricePeriod 
      WHERE @StartDate >= StartDate 
      AND  @StartDate <= EndDate 
      AND  @EndDate >= StartDate 
      AND  @EndDate <= EndDate 
      AND  ApartmentID = @ApartmentID 
      UNION ALL 
      SELECT Amount * (1 + DATEDIFF('d', StartDate, EndDate)), (1 + DATEDIFF('d', StartDate, EndDate)) , Amount 
      FROM tblPricePeriod 
      WHERE @StartDate < StartDate 
      AND  @EndDate > EndDate 
      AND  ApartmentID = @ApartmentID 
      UNION ALL 
      SELECT Amount * (DATEDIFF('d', StartDate, @EndDate)), DATEDIFF('d', StartDate, @EndDate) , Amount 
      FROM tblPricePeriod 
      WHERE @StartDate < StartDate 
      AND  @EndDate <= EndDate 
      AND  @EndDate > StartDate 
      AND  ApartmentID = @ApartmentID 
     ) AS Data 

を。サブクエリは4つの部分で構成され、上部は訪問中に価格期間の終了日が発生したときのもの、1回の価格期間内に完全に訪問したときの2番目のもの、価格期間全体を訪問したときの3番目のもの、価格期間が訪問中に始まるときのために。これは明らかです。

それでは、@ApartmentID、@StartDate、@ EndDateの各パラメータをExecuteDatasetメソッドに追加するだけです。これは、文字列を連結するよりも優れた方法です。

0
SELECT 
    SUM(( 
    IIF(EndDate < @EndDate, EndDate, IIF(@EndDate < StartDate, StartDate, @EndDate)) - 
    IIF(StartDate > @StartDate, StartDate, IIF(@StartDate > EndDate, EndDate, @StartDate)) 
) * Amount) 
FROM tblPricePeriod 

これはGarethDと同じアプローチを採用しています。それは確かに短いですが、あなたが意図を明確に示していると主張することができます。私はアクセスがないので、私はこれをテストすることができませんでしたが、私はそれがIIFの声明を持っていると信じています。 @EndDateパラメータは終了日 - 1である必要があります。したがって、私は@End Date = 2 Feb.

を渡します。IIFステートメントは基本的に各期間内でカウントする必要がある日数を計算します。

+0

これは私の最初の考えでしたが、なんらかの理由でAccessが返します。 "この式は間違って入力されているか、評価するには複雑すぎます。たとえば、数値式に複雑な要素が多すぎる可能性があります。式の一部を変数に代入して式を単純化してみてください。 "しかし、@StartDateを実際の日付(#27/02/2012#)に置き換えると正常に動作します。私はこれを理解することができませんでしたので、私はこれを働かせることができたので、組合のアプローチに行きました。 – GarethD

関連する問題