Это кажется относительно прямым (что обычно означает, что я что-то упустил).
Начиная с предположений.Скажем, таблица CALL_LOG выглядит так:
CallerId
Source
Destination
Duration
CallStartTime
CallStopTime
.,,и таблица TARRIFF выглядит следующим образом:
Id
RateType (Peak or OffPeak)
RateStartTime
RateStopTime
Rate
И давайте предположим, что вы используете Oracle, так как я не вижу, что конкретно упомянуто.Но вы говорите, CDR, так что, вероятно, много записей, так что, возможно, Oracle. (ПРИМЕЧАНИЕ. Я удалил специальный код Oracle и решил сделать это как внутреннее объединение. Возможно, это будет слишком медленно, в зависимости от объема.)
И давайте предположим, что определение«Пиковый вызов» - это вызов, который начинается в непиковое время, независимо от того, когда он заканчивается.(Обратите внимание, что это определение имеет решающее значение для правильной работы.)
Наконец, давайте предположим, что на основе ваших комментариев существует только две ставки: максимальная и непиковая.Это кажется странным, но хорошо.Я бы подумал, что время будет различаться по дням, чтобы учесть тарифы на выходные, но вы должны быть в состоянии экстраполировать.
Таким образом, стоимость звонка будет тогда
SELECT l.CallerId,
l.Source,
l.Destination,
l.Duration,
t.RateType,
l.Duration * t.Rate as Cost
FROM CALL_LOG l
INNER JOIN TARRIF t
ON l.CallStartTime BETWEEN t.RateStartTime and t.RateStopTime