Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Emerson Luiz

Calculo fracionado

Recommended Posts

Amigos,

 

Estou com um problema que não sei como resolver. Espero que possam me ajudar.

 

 

Na telefonia tem uma coisa chamada CADENCIA, resumindo basicamente, em uma chamada de 60 segundos cobramos assim:

 

30/6 OU 60/6 OU 60/60 Depende do seu plano com a operadora...

 

se o cara fala até 30 segundos, se cobra 30 segundos (em uma chamada de 12 segundos será cobrado 30 segundos)

a partir disso é cobrado a cada 6 segundos.... ou seja, se o cara falar 35 segundos é cobrado os 30+6 e assim vai....

 

então para uma chamada de 60 segundos que custe R$ 0,10 ficaria assim:

 

30s = R$ 0,05

06s = 0,0083

 

Baseado na informação acima, em uma ligação de 1:30 ou 90 segundos, teria que ter o valor final de R$ 0,15.

 

 

Alguém pode ajudar?

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua dúvida me parece em aberto demais.

 

Sua dúvida é como modelar uma solução ?

 

Como realizar os cálculos ?

 

Em sql apenas me parece complicado resolver isto , minha idea inicial seria uma function de usuário e

as function padrão do MySql numéricas, CEIL , MOD TRUNC ROUND etc

 

Mas para isto seria preciso já ter as tabelas devidamente modeladas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Obrigado pelo retorno...

 

Já temos as tabelas modeladas. A tabela que contem os valores :

 

 

mysql> select * from cdr_config_local
    -> ;
+----+-----+-----------+-----------+--------+-------------+-----------+-------------------+-----------------+
| id | ddd | estado_id | cidade_id | cortar | custo_local | custo_ldn | custo_movel_local | custo_movel_ldn |
+----+-----+-----------+-----------+--------+-------------+-----------+-------------------+-----------------+
|  1 |  31 |        11 |      2308 |      1 |        0.15 |      0.67 |              0.55 |            0.85 |
+----+-----+-----------+-----------+--------+-------------+-----------+-------------------+-----------------+
1 row in set (0,00 sec)

e a tabela onde iremos calcular...

 

mysql> select dst, billsec, cidade, estado, operadora from cdr_cdrport limit 2;
+------------+----------+----------------+--------+-----------+
| dst        | billsec  | cidade         | estado | operadora |
+------------+----------+----------------+--------+-----------+
| 2130858150 | 00:01:00 | RIO DE JANEIRO | RJ     | EMBRATEL  |
| 1434414014 | 00:00:00 | TUPA           | SP     | VIVO      |
+------------+----------+----------------+--------+-----------+
2 rows in set (0,01 sec)

criamos o seguinte código para tentar resolver....

 

SELECT dst, tipo, billsec,
CASE
WHEN cdr_cdrport.tipo = 'FIXO' AND cdr_cdrport.cidade = cdr_config_local.cidade_id AND cdr_cdrport.estado = cdr_config_local.estado_id
THEN FORMAT(cdr_cdrport.billsec*cdr_config_local.custo_local/60, 3)
WHEN cdr_cdrport.tipo = 'MOVEL' AND cdr_cdrport.cidade = cdr_cdrport.cidade AND cdr_cdrport.estado = cdr_config_local.estado_id
THEN FORMAT(cdr_cdrport.billsec*cdr_config_local.custo_movel_local/60, 3)
WHEN cdr_cdrport.tipo = 'FIXO'
THEN FORMAT(cdr_cdrport.billsec*cdr_config_local.custo_ldn/60, 3)
WHEN cdr_cdrport.tipo = 'MOVEL'
THEN FORMAT(cdr_cdrport.billsec*cdr_config_local.custo_movel_ldn/60, 3)
ELSE FORMAT(cdr_cdrport.billsec*cdr_config_local.custo_movel_ldn/60, 3)
END AS preco
  
from cdr_cdrport, cdr_config_local 
LIMIT 2;
+------------+------+----------+-------+
| dst        | tipo | billsec  | preco |
+------------+------+----------+-------+
| 2130858150 | FIXO | 00:01:00 | 1.117 |
| 1434414014 | FIXO | 00:00:00 | 0.000 |
| 4333371860 | FIXO | 00:00:05 | 0.056 |
+------------+------+----------+-------+
3 rows in set, 3 warnings (0,00 sec)

O problema que ainda ele trabalha sempre com 60 segundos e nao o fracionado....

 

Obrigado

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Não trabalho com Mysql , não tenho conhecimento da síntaxe exata.

 

2) Estou meio enrolado hoje

 

3) Mas não tem muito mistério não, existem muitos exemplos aqui mesmo no fórum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então....

 

Isso é pura matemática.

 

Tendo:

30s (bandeirada) = R$ 0,50

6s(batida) = 0,10

e o campo da duração da chamada sendo 'duracao'

 

select 0.5+(qtde_batidas*0.10) as valor

(

Select

duracao,

( (hour(duracao)*60*60)+(minute(duracao)*60)+( second(duracao) ) )duracao_em_segundos,

ceil(( ( (hour(duracao)*60*60)+(minute(duracao)*60)+( second(duracao) ) - 30)/6)) qtde_batidas

from tabela

)z

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem um erro no meu codigo, deve haver um if na quantidade de batidas para que o valor nao seja negativo. Ai fica 100%

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada que um case não resolva , mas talvez ainda assim eu faria uma function

 

1 reutilização

2 clareza dos sql

 

 

Mesmo com uma perda de performance

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.