powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подсчет стоимости проживания за период
5 сообщений из 5, страница 1 из 1
Подсчет стоимости проживания за период
    #37710363
Uniquad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, господа.
Имеется задача: рассчитать стоимость проживания в номере за период времени, то есть от даты заезда до даты выезда. Имеется таблица с ценами на этот номер на конкретные периоды времени.
Код: sql
1.
2.
3.
4.
5.
6.
create table room_prices (
  room_id BIGINT NOT NULL,
  start_month SMALLINT NOT NULL,
  start_day SMALLINT NOT NULL,
  room_price DECIMAL NOT NULL,
);



Задача, в принципе, типовая, но что-то ответа на свой вопрос я не нахожу. Вопрос в следующем: каким запросом можно самым оптимальным способом подсчитать стоимость проживания? Пока, единственное, что я вижу - это сделать выборку, где каждая строка будет соответствовать одному дню проживания, и потом полученные строки сложить. Но может есть другой способ? Не так, чтобы каждая строка результата выглядела как "цена проживания на такую-то дату составила столько-то", а так, чтобы каждая строка была вида "цена за проживание с такого-то по такое-то число составила столько-то". Или это будет гораздо более ресурсоёмко, чем вариант "одна строка на каждое число"?
И в варианте "одна строка на каждое число" - обязательно использовать подзапрос, или можно сделать всё как-то более оптимально?
...
Рейтинг: 0 / 0
Подсчет стоимости проживания за период
    #37710405
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для всех периодов проживания находятся пересечения с периодами действия цены и затем по найденным пересечениям вычисляется стоимость. Один джоин по номеру и два кейза - для даты начала пересечения и даты окончания пересечения.
...
Рейтинг: 0 / 0
Подсчет стоимости проживания за период
    #37710690
Uniquad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программист-Любитель,
А пример можно в студию? )) А то я что-то не соображу, как это сделать. В таблице цен указаны не периоды полностью, а только даты начала периодов.
Пока я решаю это так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  SELECT
    SUM(
      (
        SELECT
          room_price
        FROM room_prices
        WHERE
          room_id = _roomId
          AND (
            stay_date >= (extract(year from stay_date) || '-' || start_month || '-' || start_day)::date
            OR stay_date >= (extract(year from stay_date) - 1 || '-' || start_month || '-' || start_day)::date
            )
        ORDER BY
          stay_date >= (extract(year from stay_date) || '-' || start_month || '-' || start_day)::date DESC,
          start_month DESC,
          start_day DESC
        LIMIT 1
      )
    ) as total_price INTO STRICT _totalPrice
    FROM generate_series(_dateStart::timestamp, (_dateEnd - 1)::timestamp, '1 day'::interval) AS stay_date;


Где _dateStart, _dateEnd, _roomId - параметры, передаваемые в хранимую процедуру.
...
Рейтинг: 0 / 0
Подсчет стоимости проживания за период
    #37711126
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цена у вас за день, верно?
Тогда вам нужны две функции (или подзапроса)
Дата конца периода неизменной цены (d_start позже этой даты, _dateEnd если раньше этой даты смены цены не было)
цена на определенную дату(dprice)
Количество строк в запросе будет равно числу смен цены между _dateStart и _dateEnd плюс одна строка.
Для простоты заменим start_month и start_day на d_change
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select _dateStart as d_start,
Дата_конца_периода_неизменной_цены(_dateStart,_dateEnd,_roomId ) as d_end,
цена_на_определенную дату(_dateStart, _roomId )
union all 
select d_change as d_start,
Дата_конца_периода_неизменной_цены(d_change,_dateEnd,_roomId ) as d_end,
цена_на_определенную дату(d_change,_roomId )
from room_prices
where room_id=_roomId and d_change between _dateStart and _dateEnd



подзапросы/функции сделайте самостоятельно (с этим у вас проблем не вижу)
теоретически можно совместить оба подзапроса для оптимизации но тогда теряется ясность и простота
...
Рейтинг: 0 / 0
Подсчет стоимости проживания за период
    #37711188
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нарисуйте на бумажке два наезжающих друг на друга прямоугольника - период 1 и период 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- Пересечение 
         dtIntersectFrom = 
            CASE 
               WHEN Period1.ToDate < Period2.FromDate THEN NULL
               WHEN Period1.FromDate > Period2.ToDate THEN NULL
               WHEN Period1.FromDate <= Period2.FromDate THEN Period2.FromDate
               WHEN Period1.FromDate > Period2.FromDate THEN Period1.FromDate
            END,
         dtIntersectTo = CASE 
            WHEN Period1.ToDate < Period2.FromDate THEN NULL
            WHEN Period1.FromDate > Period2.ToDate THEN NULL
            WHEN Period1.ToDate <= Period2.ToDate THEN Period1.ToDate
            WHEN Period1.ToDate > Period2.ToDate THEN Period2.ToDate
         END,
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подсчет стоимости проживания за период
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]