letsgo
Новичок
Помогите с составлением запроса по подсчёту стоимости
Здравствуйте!
Прошу помощи в составлении запроса к таблице БД для подсчёта стоимости тарифа.
Структура таблицы:
idtariff - ID тарифа
`valid_from`, `valid_to` - Период, при бронировании в котором действует данная цена (может быть пустым), соответственно Дата Начала и Дата окочания
`date_start`,`date_finish` - Период, в который действует цена на данный тариф
`price` - Стоимость тарифа в сутки
Представим, что сейчас на дворе 1 июля 2010 и мы хотим узнать стоимость тарифа с idtariff=5 c 28.07.2010 по 03.08.2010
Тогда нам необходимо взять в расчёт следующие периоды:
Строка с ID=1 (14.07.2010 31.07.2010): Мы берем 4 дня. 25*4=100
Строка с ID=3 ( 01.08.2010 22.08.2010): Мы берем 3 дня. 23*3=69
Получается стоимость тарифа = 169
Если мы хотим узнать стоимость тарифа, который будет действовать с 28.07.2010 по 03.08.2010,
в промежуток времени между 06.07.2010 и по 22.08.2010, то нам необходимо взять следующие строки:
Строка с ID=1 (14.07.2010 31.07.2010): Мы берем 1 день. 25*1=25
Строка с ID=2 (14.07.2010 31.07.2010): Мы берем 3 дня. 21*3=63
Строка с ID=4 (06.07.2010 22.08.2010): Мы берем 3 дня. 20*3=60
Получается стоимость тарифа = 148
В общем, как понимаете сложностей много (по крайней мере для меня). Как все эти подробности учесть и при этом минимизировать
количество запросов к БД?
Раньше, когда поля `valid_from`, `valid_to` в таблице отсутствовали применялся запрос:
, но тогда в таблице не было пересекающихся дат, т.е. наличие периодов вида 25.07.2010 - 02.08.2010, 01.08.2010 - 20.08.2010 было невозможно. В базе хранились периоды 25.07.2010-31.07.2010 и 01.08.2010-20.08.2010
Сейчас с появлением указанных выше полей пересекающиеся даты появились, что вызывает большие трудности при подсчёте стоимости.
Буду благодарен за помощь и с радостью отвечу на все-все-все вопросы....
Заранее спасибо, коллеги
Здравствуйте!
Прошу помощи в составлении запроса к таблице БД для подсчёта стоимости тарифа.
Структура таблицы:
PHP:
id | idtariff | valid_from | valid_to | date_start | date_finish | price |
1 5 14.07.2010 31.07.2010 25
2 5 06.07.2010 22.08.2010 29.07.2010 31.07.2010 21
3 5 01.08.2010 22.08.2010 23
4 5 06.07.2010 22.08.2010 01.08.2010 22.08.2010 20
`valid_from`, `valid_to` - Период, при бронировании в котором действует данная цена (может быть пустым), соответственно Дата Начала и Дата окочания
`date_start`,`date_finish` - Период, в который действует цена на данный тариф
`price` - Стоимость тарифа в сутки
Представим, что сейчас на дворе 1 июля 2010 и мы хотим узнать стоимость тарифа с idtariff=5 c 28.07.2010 по 03.08.2010
Тогда нам необходимо взять в расчёт следующие периоды:
Строка с ID=1 (14.07.2010 31.07.2010): Мы берем 4 дня. 25*4=100
Строка с ID=3 ( 01.08.2010 22.08.2010): Мы берем 3 дня. 23*3=69
Получается стоимость тарифа = 169
Если мы хотим узнать стоимость тарифа, который будет действовать с 28.07.2010 по 03.08.2010,
в промежуток времени между 06.07.2010 и по 22.08.2010, то нам необходимо взять следующие строки:
Строка с ID=1 (14.07.2010 31.07.2010): Мы берем 1 день. 25*1=25
Строка с ID=2 (14.07.2010 31.07.2010): Мы берем 3 дня. 21*3=63
Строка с ID=4 (06.07.2010 22.08.2010): Мы берем 3 дня. 20*3=60
Получается стоимость тарифа = 148
В общем, как понимаете сложностей много (по крайней мере для меня). Как все эти подробности учесть и при этом минимизировать
количество запросов к БД?
Раньше, когда поля `valid_from`, `valid_to` в таблице отсутствовали применялся запрос:
PHP:
SELECT price, CASE WHEN date_start < $datestart AND date_finish < $dateend THEN date_finish - $datestart ... остальные 3 случая по аналогии END as days FROM table WHERE date_start BETWEEN $datestart AND $dateend OR date_finish BETWEEN $datestart AND $dateend
Сейчас с появлением указанных выше полей пересекающиеся даты появились, что вызывает большие трудности при подсчёте стоимости.
Буду благодарен за помощь и с радостью отвечу на все-все-все вопросы....
Заранее спасибо, коллеги