【问题标题】:How to calculate call cost with an SQL query for Billing如何使用计费的 SQL 查询计算通话费用
【发布时间】:2011-04-12 23:28:28
【问题描述】:

有没有人知道如何从 sql 中的通话记录表和资费表计算通话费用并将输出放入新表中???

几秒钟或几分钟的关税费率。

您能否提供一些示例查询?

这是我用来创建带有字段名称的表的代码:

CREATE TABLE cdr (
accountcode VARCHAR (30),
src VARCHAR(64),
dst VARCHAR(64),
dcontext VARCHAR(32),
clid VARCHAR(32),
channel VARCHAR(32),
dstchannel VARCHAR(32),
lastapp VARCHAR(32),
lastdata VARCHAR(64),
calldate TIMESTAMP NOT NULL,
answerdate TIMESTAMP NOT NULL,
hangupdate TIMESTAMP NOT NULL,
duration INT(8) UNSIGNED DEFAULT NULL,
billsec INT(8) UNSIGNED DEFAULT NULL,
disposition VARCHAR(32),
amaflags VARCHAR(128),
PRIMARY KEY (clid,channel,calldate)
);

对于关税税率,我有高峰和非高峰:

CREATE TABLE tariffs (ratestart TIME, rateend TIME, ratecharged DECIMAL(10,8));

INSERT INTO tariffs(ratestart, rateend, ratecharged)
    VALUES("08:00:00", "19:00:00", 3.3333);
INSERT INTO tariffs(ratestart,rateend,ratecharged)
    VALUES("19:00:00", "08:00:00", 1.5555);

我希望将通话费用的输出制成一个新表,其中包含 callerid、来源、目的地、通话时长、资费和通话费用。

我还应该创建另一个包含用户列表的表吗?以及如何在周末向非高峰期收费?

【问题讨论】:

  • 嗯。添加?减法?一些分数?真的需要更多信息。
  • 您能否发布表定义、一些示例数据和预期输出以及算法说明(即第一分钟 0.10,基于 ELAPSED_MINUTES 中的列,每增加一分钟 0.08 CALL_LOG 表。使用 CALL_LOG 中的 TARIFF_ID 列将结果乘以 TARIFF 表中的 1+TARIFF_PCT 用于连接)。
  • "您能否提供一些示例查询。"只有你先发布一些代码,如果你给我看你的,我会告诉你我的;)
  • @Pekka - 我有两张表,一张是包含通话时长、来源和目的地以及其他一些字段的通话记录,我还有一张包含关税、非高峰和高峰费率的表格。我想知道如何查询这些表以按分钟或秒计算关税费率的通话时间,这将为我提供每次通话的费用。这将被插入到一个新表中,其中包含源、目标、callerid、通话时长和通话费用。
  • @Adnan 我明白了。我认为最好能显示实际的表结构。

标签: mysql sql billing


【解决方案1】:

您应该通过在关税表中插入更多数据来简化您的生活:

INSERT INTO tariffs(ratestart, rateend, ratecharged)
    VALUES("00:00:00", "08:00:00", 1.5555);
INSERT INTO tariffs(ratestart, rateend, ratecharged)
    VALUES("08:00:00", "19:00:00", 3.3333);
INSERT INTO tariffs(ratestart, rateend, ratecharged)
    VALUES("19:00:00", "24:00:00", 1.5555);

通过区分清晨和深夜费率,这使得处理电话更加简单。 (如果您不能像那样存储午夜,您可能需要使用 '23:59:59' 代替 '24:00:00',但是您需要在转换前将其他结束时间调整为 1 秒,并且您修改查询以使用“<= rateend”而不是“< rateend”。)

您是否需要担心两个资费期限重叠的电话?持续超过整个资费期限的电话呢?超过 24 小时?

您还应该翻译您使用的术语。例如,您要求:

带有来电显示、来源、目的地、通话时长、资费和通话费用

  • 来电显示⟶clid
  • 来源⟶src
  • 目的地⟶dst
  • 通话时长⟶duration
  • 关税⟶ratecharged

用什么单位来衡量通话时长?收费制度是否只是通话开始时适用的费率,因此有人在 07:59:59 通话 12 小时后可以按夜间费率通话?通话时长与计费秒数有何不同?计算是否应该使用计费秒数?

您可能还想查看与此问题非常相似的上一个问题:

【讨论】:

  • @Jonathan - 我不知道如果在非高峰期间拨打电话并延续到高峰费率,我将如何计算通话费用,通话持续时间也不同于计费秒数,例如通话持续时间在哪里当用户输入一个号码并拨打它时,它包括响铃,不应该向用户收费,但计费秒数是当有人接听电话然后挂断时,这是应该收费的秒数。
  • @Jonathan - 另外我应该补充一点,我正在创建一个应用程序,它将查询数据库并显示带有 C# 调用成本的表。
  • @Adnan:不幸的是,生活是复杂的。你需要考虑我提出的问题。使用 C# 完全是巧合;使用任何特定的 DBMS 很大程度上是巧合。您将需要处理摘要中提出的问题,了解跨资费率变化的呼叫将被处理多长时间。当您在周末处理不同的费率时,这一点非常重要;那么您的关税表也将包含“星期几”信息。
  • @Adnan:大概,您的应用程序将不得不查看answerdate 而不是calldate 来确定通话开始时的资费。您可能必须将单个呼叫记录划分为多个计费记录,或将多个组件“费率 × 持续时间”值汇总为单个呼叫的单个数字。最常见的情况是将一个这样的数字相加;一般情况可能需要对许多这样的数字求和。
  • 嗯。与您第一次尝试此问题 (stackoverflow.com/questions/5545480/…) 相比略有改进,但老实说,您仍然试图让社区为您编写它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多