计算通话时长的数学公式

7 sql math formula query-help

几年前我在一家电信公司工作,我不得不根据以下算法生成一个计算呼叫持续时间的公式:

  • t1是第一个时期
  • t2是经常性的时期
  • RCT是实际通话时间(以秒为单位)
  • CD是有效的呼叫持续时间(用于计费目的)

如果RCT小于t1,则如果RCT大于t1则CD等于t1
,则CD = t1 + x*t2,其中x将"舍入"RCT到t2的下一个最高倍数.

该算法转换为:"第一个t1秒充电,然后每隔t2秒充电".

例:

t1  t2  RCT CD  
60  10  48  60
60  10  65  70
60  10  121 130
30  20  25  30
30  20  35  50
30  20  65  70
Run Code Online (Sandbox Code Playgroud)

你能创建一个能够返回"呼叫持续时间"CD的函数/ SQL吗?

不使用if then else ......?

God*_*eke 2

编辑:进一步简化,并修复了 < vs <= 错误。

没有浮点,适用于我有权访问的每个数据库:

create table calls (t1 int, t2 int, rct int, cd int)

insert into calls (t1, t2, rct, cd) 
values (60, 10, 48, 60)

insert into calls (t1, t2, rct, cd) 
values (60, 10, 65, 70)

insert into calls  (t1, t2, rct, cd)
values (60, 10, 121, 130)

insert into calls  (t1, t2, rct, cd)
values (30, 20, 25, 30)

insert into calls  (t1, t2, rct, cd)
values (30, 20, 35, 50)

insert into calls  (t1, t2, rct, cd)
values (30, 20, 65, 70)

--Additional test to show that it works
insert into calls  (t1, t2, rct, cd)
values (60, 10, 70, 70)

select t1, t2, rct, cd, 
t1 + case when rct <= t1 
  then 0 
  else ( (rct-1-t1) / t2 + 1) * t2 end as CalceCD
from calls
Run Code Online (Sandbox Code Playgroud)

结果:

t1 t2 rct cd CalceCD
----------- ----------- ----------- ----------- ------ -----
60 10 48 60 60
60 10 65 70 70
60 10 121 130 130
30 20 25 30 30
30 20 35 50 50
30 20 65 70 70
60 10 70 70 70

(受影响的 6 行)

您可以自由地将函数创建为 UDF 或任何您的 SQL 环境允许清理选择的函数。

编辑:是的,下限和偏移量一可以避免浮动数学。