2012-06-23 6 views
0

У меня есть следующая таблица SEASONS с указанием периодов времени, определяющих цены бронирования за каждый период дня;SELECT общая сумма доставки

ID, STARTDATE, ENDDATE, PRICE 
6, 2012-06-01, 2012-06-30, 20 
7, 2012-07-01, 2012-07-31, 35 
8, 2012-08-01, 2012-08-31, 30 
9, 2012-09-01, 2012-09-30, 25 

Эта таблица определяет периоды цен (даты начала и окончания ценовой период с ценой заказа за каждый день в этом определенный период цен). Вопрос заключается в том, как создать запрос, который вернет общую стоимость бронирования на все дни в определенный период бронирования? Например, как рассчитать (SELECT?) Общую стоимость бронирования (SUM) за период с 2012-06-10 по 2012-08-20?

(Разумеется, его можно легко вычислить вручную = 21 (дней в июне) x20 + 31 (дней в июле) x35 + 20 (дней в августе) x30 = 2105) Как выглядит инструкция SELECT, возвращающая эту общую стоимость бронирования как?

ответ

1

Использование DATEDIFF функции:

SELECT SUM(DATEDIFF(ENDDATE,STARTDATE) * PRICE) AS TOTAL_PRICE 
    FROM SEASONS 
    WHERE STARTDATE <= '2012-06-10' AND ENDDATE >= '2012-08-20' 

Кроме того, мы можем добавить проверку для начала бронирования/конец, так как они находятся где-то в середине, и вы не должны включать в себя весь период ...

Итак:

SET @START='2012-06-10'; 
SET @END='2012-08-20'; 
SELECT SUM(
    DATEDIFF(
    IF(YEAR(ENDDATE)=YEAR(@END) AND MONTH(ENDDATE)=MONTH(@END), @END, ENDDATE), 
    IF(YEAR(STARTDATE)=YEAR(@START) AND MONTH(STARTDATE)=MONTH(@START), @START, STARTDATE) 
    ) 
) AS TOTAL_SUM 
FROM SEASONS 
WHERE STARTDATE <= @END AND ENDDATE >= @START 
+0

большой ответ 'SET @ START = '2012-06-10'; SET @ END = '2012-08-20'; SELECT SUM ( (DATEIFF ( ) IF (ГОД (конец) = ГОД (@END) И МЕСЯЦ (enddate) = MONTH (@END), @END, enddate), IF (YEAR (startdate) = YEAR (@ START) И МЕСЯЦ (начальная дата) = MONTH (@START), @START, startdate) ) +1) * цена ) AS TOTAL_SUM ОТ сезонов WHERE startdate <= @END AND enddate> = @ START ' – sbrbot

0

Просто для других читателей, в результате чего из предыдущего ответа окончательный запрос:

SET @START='2012-06-10'; 
SET @END='2012-08-20'; 
SELECT SUM(
(DATEDIFF(
    IF(enddate>[email protected],@END,enddate),  
    IF(startdate<[email protected],@START,startdate) 
)+1)*price) AS TOTAL_SUM 
FROM seasons WHERE startdate<[email protected] AND enddate>[email protected] 

1 следует добавить к разнице дат, чтобы как начальная, так и конечная дата были включены в диапазон ценообразования и, конечно же, его следует умножать на цену.

@poncha большое спасибо, я уже создал процедуру, которая перебирает все даты в период бронирования Fetching несколько цен и суммируя их в качестве решения, но я знал, что должен быть более простым и эффективным решением

Смежные вопросы