从价格周期表中获取金额

时间:2012-02-27 09:05:51

标签: c# sql winforms ms-access

我有一个表格价格期间tblPricePeriod,其中我在特定公寓的两个日期之间收取Amount费用。

我在[{1}}的价格期间也有StartDateEndDate列。

以下是我桌子的结构:

enter image description here

现在我想计算收取预订天数的总金额。

例如,如果有人从4feb到7bb,那么他必须按照以下方案付款:

ApartmentId

我有4- 10 5- 10 6- 10 7 - nothing as this is checkout date ----------------------------------------------------- totamt--- 30$ startdate以及enddate作为参数,我正在使用ms access db。

现在我使用c#代码来跟踪代码,但没有成功。

我逐个获取所有日期的金额,并将它们添加到一个全局变量中。

代码如下:

apartmentid

3 个答案:

答案 0 :(得分:1)

以下是Sql中的SUM函数示例:

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

//编辑:

您可以直接选择金额总和,而不是循环使用DateTimes:

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( ) + "'";

答案 1 :(得分:0)

您可以采用完全SQL方法:

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

由于Access不允许评论,因此我无法对查询进行注释。子查询有4个部分,顶部用于访问期间价格期末结束日期,第二部分用于访问完全在1个价格期间,第3个用于访问跨越整个价格期间,第4个部分因为在访问期间价格期间开始。希望这很清楚。

您需要做的就是将参数@ApartmentID,@ StartDate和@EndDate添加到ExecuteDataset方法中,这比连接字符串更好。

答案 2 :(得分: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 = 6月2日。

IIF语句基本上计算每个时期内需要计算的天数。