Округление длительности

Наибольшая точность сохранения длительности вызова в базе данных, которая доступна в системе - посекундная.
Посекундная длительность доступна в CDR для всех вызовов, прошедших через систему.

Также для звонков, которые прошли через Биллинг, в базе данных хранится вычисленная на основании Биллингового инкремента длительность вызова в минутах.
При выполнении Пересчета биллинга длительность вызова в минутах пересчитывается заново исходя из Биллингового инкремента и длительности вызова в секундах.
Длительность вызова в секундах после сохранения CDR является неизменной и пересчету не подлежит.

Однако секундная точность не является наименьшим атомом измерения длительности.
Секунда состоит из миллисекунд, в миллисекунда состоит из микросекунд итп.
Таким образом, возникает проблема выбора режима округления.

Например, звонок начался в 15 сек. 300 мсек, а закончился в 25 сек. 900 мсек.
Можно вычислить длительность только на основании секунд как 25 - 15 = 10 сек.
Либо же можно вычислить длительность как 25.800 - 15.300 = 10.500 сек, далее можно округлить до 10 либо 11 сек.

Казалось бы проблема округления 1 секунды незначительна и можно ею пренебречь.
Однако на больших объемах телефонного трафика разница в округлении может давать значительные суммы расхождения при расчетах с партнерами.
Биллинговые системы партнеров могут использовать различные схемы округления длительности.
Крайне желательно использовать одинаковый метод округления длительности между партнерами.

На проблему округления накладывается проблема задержек в сети VoIP.
Например, оригинатор отбил вызов и отправил вам сообщение о завершении, а сообщение к вам дошло через 500мсек.
Расхождение в длительности может возникнуть и по этой причине.

В системе доступны следующие режимы округления:

К меньшему, потом вычесть.

Время начала и время завершения вызова округляются в меньшую сторону до секунд.
Затем, для получения длительности вызова, из времени завершения вычитается время начала.

Пример.

время начала 2013-01-01 01:00:15.300
время завершения 2013-01-01 01:00:25.900

Длительность = 25 - 15 = 10 сек.

Вычесть, потом к ближайшему, середина округляется в бОльшую сторону.

Пример 1.

время начала 2013-01-01 01:00:15.300
время завершения 2013-01-01 01:00:25.900

Сначала вычитаем: длительность = 25.900 - 15.300 = 10.600
Далее округляем к ближайшему: длительность = 11 сек.

Пример 2.

время начала 2013-01-01 01:00:15.300
время завершения 2013-01-01 01:00:25.800

Сначала вычитаем: длительность = 25.800 - 15.300 = 10.500
Далее округляем к ближайшему. Поскольку 500 посредине, а середина округляется в бОльшую сторону, длительность = 11 сек.

Пример 3.

время начала 2013-01-01 01:00:15.300
время завершения 2013-01-01 01:00:25.700

Сначала вычитаем: длительность = 25.700 - 15.300 = 10.400
Далее округляем к ближайшему: длительность = 10 сек.

Вычесть, потом к бОльшему.

Пример 1.

время начала 2013-01-01 01:00:15.300
время завершения 2013-01-01 01:00:25.900

Сначала вычитаем: длительность = 25.900 - 15.300 = 10.600
Далее округляем к большему: длительность = 11 сек.

Пример 2.

время начала 2013-01-01 01:00:15.30
время завершения 2013-01-01 01:00:25.700

Сначала вычитаем: длительность = 25.700 - 15.300 = 10.400
Далее округляем к большему: длительность = 11 сек.

English translation