получить сумму из таблицы ценового периода - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть период цены стола tblPricePeriod, в котором у меня есть Amount, который взимается между двумя датами за конкретную квартиру.

У меня также есть столбцы StartDate и EndDate для периода цен с ApartmentId.

Ниже приведена структура моей таблицы:

enter image description here

Теперь я хочу рассчитать начисление общей суммы за дни бронирования.

Например, если кто-то остается с 4 февраля по 7 февраля, он должен заплатить по следующей схеме:

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

У меня есть startdate и enddate и apartmentid в качестве параметра, я использую MS Access DB.

Теперь я использую код C #, чтобы пройти это с последующим кодом, но не удалось.

Я получаю сумму для всех дат одну за другой и добавляю их в одну глобальную переменную.

Код выглядит следующим образом:

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"]);
    }
}

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Вот пример функции SUM в Sql:

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 голосов
/ 27 февраля 2012
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 февраля.

Отчеты ИИФ в основном рассчитывают количество дней, которое необходимо подсчитать в каждом периоде.

0 голосов
/ 27 февраля 2012

Вы можете принять полностью 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 частей: верхняя часть предназначена для даты окончания периода ценового периода во время посещения, вторая - для случая, когда посещение полностью попадает в один ценовой период, третья - для посещения, когда посещение пересекает весь ценовой период, и четвертая когда ценовой период начинается во время посещения. Надеюсь, это понятно.

Все, что вам тогда нужно будет сделать, это добавить параметры @ApartmentID, @StartDate и @EndDate к вашему ExecuteDataset методу, который в любом случае лучше подходит, чем объединение строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...