Pular para o conteúdo

Marcado: 

  • Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 5 anos, 10 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #114148
    Avatar de airoospairoosp
    Participante

      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

      #114164
      Avatar photoJosé Laurindo Chiappa
      Moderador

        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 😡 := 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

        #114167
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Obs : 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

          #114176
          Avatar photoJosé Laurindo Chiappa
          Moderador

            (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,747945

            scott@chiappa:chiappa-DESENV:SQL>select : x numero_com_decimais, trunc(: x) – : x as decimais_apenas from dual;

            NUMERO_COM_DECIMAIS DECIMAIS_APENAS
            ——————- —————
            14,747945 -,7479452

            scott@chiappa:chiappa-DESENV:SQL>

            okdoc ??

            ´[]s

            Chiappa

            #114177
            Avatar photoJosé Laurindo Chiappa
            Moderador

              Ah, 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 ,74794520547945

              scott@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….

              #114178
              Avatar de airoospairoosp
              Participante

                Chiappa,

                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

                #114179
                Avatar photoJosé Laurindo Chiappa
                Moderador

                  Nope : 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
                  —————————————————————————————————-
                  74794520547945

                  scott@chiappa:chiappa-DESENV:SQL>

                  Blz ???

                  []s

                  Chiappa

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress