我有一个表格价格期间tblPricePeriod
,其中我在特定公寓的两个日期之间收取Amount
费用。
我在[{1}}的价格期间也有StartDate
和EndDate
列。
以下是我桌子的结构:
现在我想计算收取预订天数的总金额。
例如,如果有人从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
答案 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语句基本上计算每个时期内需要计算的天数。