这似乎相对简单(这通常意味着我错过了一些东西)。
从假设开始。假设 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