Marcado: sql
- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 5 anos, 10 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
22 de janeiro de 2019 às 12:39 pm #114148airoospParticipante
Boa tarde pessoal,
Ao executar a operação 5383/365, o resultado é 14,7479452054795. Como retornar apenas os números após a vírgula.
Tentei alguns exemplos usando to_char, mas não consegui encontrar uma solução.
Se alguém tiver alguma dica, agradeço.Obrigado.
Airton
22 de janeiro de 2019 às 1:39 pm #114164José Laurindo ChiappaModeradorBlz, tudo na tranquila ?? Espero que sim…. Então, tua dúvida tem duas partes, uma matemática e outro de RDBMS Oracle : matematicamente, existem outras formas mas imho a mais simples opção é SUBTRAIR do número decimal a parte inteira, o que sobra por definição são os decimais…. Na parte refererente ao RDBMS Oracle, entre (novamente) N possibilidades imho a mais simples e prática opção para vc encontrar a parte inteira de um número é a função TRUNC, na qual se vc não informar a qtdade de casas decimais a preservar ela não preserva decimal alguma…..
Juntando as duas coisas :scott@chiappa:chiappa-DESENV:SQL>variable x number;
scott@chiappa:chiappa-DESENV:SQL>exec 😡 := 5383/365;Procedimento PL/SQL concluído com sucesso.
scott@chiappa:chiappa-DESENV:SQL>print x
X
14,747945
scott@chiappa:chiappa-DESENV:SQL>select 😡 numero_com_decimais, trunc(:x) – 😡 as decimais_apenas from dual;
NUMERO_COM_DECIMAIS DECIMAIS_APENAS
14,747945 -,7479452
scott@chiappa:chiappa-DESENV:SQL>
okdoc ??
[]s
Chiappa
22 de janeiro de 2019 às 1:43 pm #114167José Laurindo ChiappaModeradorObs : por causa do software do fórum, vc provavelmente vai ver uma carinha brava vermelha no meio do meu código – na verdade, isso é a junção do caracter : com o caracter x , eu quis me referenciar ao conteúdo da minha bind variable x…. SE isso acontecer pra vc, substitua….
[]s
Chiappa
22 de janeiro de 2019 às 1:59 pm #114176José Laurindo ChiappaModerador(ixe, deu uma confa legal aqui – vou tentar colocau um espaço em branco entre o : e o x da minha variável, remove aí esse espaço, ok) … Deixa eu colar minha resposta de novo…
Blz, tudo na tranquila ?? Espero que sim…. Então, tua dúvida tem duas partes, uma matemática e outro de RDBMS Oracle : matematicamente, existem outras formas mas imho a mais simples opção é SUBTRAIR do número decimal a parte inteira, o que sobra por definição são os decimais…. Na parte refererente ao RDBMS Oracle, entre (novamente) N possibilidades imho a mais simples e prática opção para vc encontrar a parte inteira de um número é a função TRUNC, na qual se vc não informar a qtdade de casas decimais a preservar ela não preserva decimal alguma…..
Juntando as duas coisas :scott@chiappa:chiappa-DESENV:SQL>variable x number;
scott@chiappa:chiappa-DESENV:SQL>exec : x := 5383/365;Procedimento PL/SQL concluído com sucesso.
scott@chiappa:chiappa-DESENV:SQL>print x
X
———
14,747945scott@chiappa:chiappa-DESENV:SQL>select : x numero_com_decimais, trunc(: x) – : x as decimais_apenas from dual;
NUMERO_COM_DECIMAIS DECIMAIS_APENAS
——————- —————
14,747945 -,7479452scott@chiappa:chiappa-DESENV:SQL>
okdoc ??
´[]s
Chiappa
22 de janeiro de 2019 às 3:09 pm #114177José Laurindo ChiappaModeradorAh, relendo minha resposta, vi que tinha um errinho de digitação : tem que ser número – parteinteiradonúmero, e eu tinha escrito o contrário…
E outro ponto : cfrme creio que já é sabido, o database dá para o software cliente o número EXATAMENTE TAL COMO ele veio : EXIBIR O DADO é por conta do software cliente, okdoc ??? No meu caso estou usando o SQLPLUS como programa-cliente, e nele vc ajusta assim a EXIBIÇÃO de um número :scott@chiappa:chiappa-DESENV:SQL>set NUMWIDTH 18
scott@chiappa:chiappa-DESENV:SQL>set NUMFORMAT 999D99999999999999==> OU SEJA, para EXIBIÇÃO no MEU programa-cliente sqlplus os meus números podem ter até 18 dígitos no total E desses 18 até 14 podem ser casas decimais….
scott@chiappa:chiappa-DESENV:SQL>print x
X
——————-
14,74794520547945==> blz ?? Agora sim, fazendo a conta o meu programa-cliente vai exibir o que eu quero :
scott@chiappa:chiappa-DESENV:SQL>select : x numero_com_decimais, : x – trunc(: x) as decimais_apenas from dual;
NUMERO_COM_DECIMAIS DECIMAIS_APENAS
——————- ——————-
14,74794520547945 ,74794520547945scott@chiappa:chiappa-DESENV:SQL>
==> Blz ??
[]s
Chiappa
OBS : com quase Absoluta certeza, seja qual for o teu programa-cliente ou a sua linguagem de programaçãp, certamente deve haver algum setting/ajuste para exibição de números….Só apele para TO_CHAR ** SE ** e apenas ** SE ** realmente, absolutamente, completamente teu programa-cliente e/ou tua linguagem de programação não tem como formatar números para Exibição….
SE vc for apelar pro quebra-galho do TO_CHAR, não esqueça do argumento NLS_NUMERIC_CHARACTERS para a função TO_CHAR, senão vc fica à mercê dos ajustes de linguagem da sessão conectando no banco….22 de janeiro de 2019 às 3:24 pm #114178airoospParticipanteChiappa,
Agradeço as tuas informações, pensei que usando apenas o to_char com alguma configuração do parâmetro por exemplo 99D99999 seria possível.
Abraço,
Airton
22 de janeiro de 2019 às 3:48 pm #114179José Laurindo ChiappaModeradorNope : pode olhar na documentação do TO_CHAR (https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm mostra a do 10g, consulte a da sua versão específica) que vc Não Tem um elemento de formato que elimine parte inteira do número : tem como vc colocar zeros à esquerda, brancos á esqerda, tem como eliminar sinal negativo, um monte de opções mas remover parte inteira não tem…
E insisto : idealmente vc usa operações numéricas tal como a que fiz, mas se por qquer motivo vc for Obrigado a apelar pro TO_CHAR, não deixe de usar a opção FORMAT_MASK , pois assim o caracter indicador de decimal fica necessariamente fixo, viabilizando vc o localizar com INSTR e a partir daí cortar um pedaço da string com SUBSTR…. Tipo :
scott@chiappa:chiappa-DESENV:SQL>variable s varchar2(200);
scott@chiappa:chiappa-DESENV:SQL>exec : s := to_char(: x, ‘999D99999999999999’, ‘nls_numeric_characters=”,.”’);
Procedimento PL/SQL concluído com sucesso.
scott@chiappa:chiappa-DESENV:SQL>print s
S
—————————————————————————————————-
14,74794520547945==> Tá vendo ?? Com esse setting eu ** ASSEGUREI ** que o caracter indicador de decimal SEMPRE vai ser vírgula nesse TO_CHAR, então é bico localizar ele via INSTR, aí eu uso isso como argumento pro SUBSTR saber de onde ler a string :
scott@chiappa:chiappa-DESENV:SQL>select SUBSTR(: s, instr(: s, ‘,’)) from dual;
SUBSTR(: s,INSTR(: s,’,’))
—————————————————————————————————-
,74794520547945==> Ou se quiser eliminar a vírgula também, é INSTR+1 :
scott@chiappa:chiappa-DESENV:SQL>select SUBSTR(: s, instr(: s, ‘,’)+1) somente_decimais from dual;
SOMENTE_DECIMAIS
—————————————————————————————————-
74794520547945scott@chiappa:chiappa-DESENV:SQL>
Blz ???
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.