Наибольшая точность сохранения длительности вызова в базе данных, которая доступна в системе - посекундная.
Посекундная длительность доступна в 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 сек.