none
CONVERTENDO DADOS VARCHAR PARA INT, DECIMAL OU NUMERIC. RRS feed

  • Pergunta

  • Boa noite Prezados!

    Preciso na verdade de uma grande ajuda urgente, eu recebi uma tabela e importei para o Server 2014 como varchar (toda tabela para que não ocorra erros), e nessa tabela temos a coluna MOT_FINAL que está e deve ficar da seguinte forma 1,81620903454384410983170947741364039609.

    Ocorre que quando vou trabalhar nela para fazer o SUM, dá o erro: Mensagem 8117, Nível 16, Estado 1, Linha 9
    O tipo de dados de operando varchar é inválido para o operador sum.

    Sim, certamente isso ocorrera pois ela está no formato de varchar, agora se eu utilizo os comandos abaixo:

    CONVERT(INT,  MOTIVO_FINAL) - Erro: Falha ao converter o varchar valor '1,81620903454384410983170947741364039609' para o tipo de dados int.

    CONVERT(DECIMAL,  MOTIVO_FINAL) - Erro: Erro de estouro aritmético ao converter varchar no tipo de dados numeric.

    Ou também o comando CAST, não consigo converte o dados e mater nesse formato que devo deixa-lo acima.

    Alguém pode me ajudar, me explicar de como converter o varchar da coluna e manter nesse 1,81620903454384410983170947741364039609, para que eu possa fazer o SUM?

    Obrigado.

    Abs.



    • Editado LucianodaMata sexta-feira, 25 de novembro de 2016 02:11
    sexta-feira, 25 de novembro de 2016 02:10

Respostas

Todas as Respostas

  • Deleted
    sexta-feira, 25 de novembro de 2016 09:05
  • Fique ciente que ele fará a conversão, mas que não utilizará todas as casas decimais, ou seja, acontecerá o arredondamento.

    Fazendo um teste com o código que o José Diz sugeriu, o retorno foi 1.81620903454384 (14 casas decimais contra 39 do número original). 

    No StackOverflow há uma longa discussão sobre o assunto, confira: http://stackoverflow.com/questions/61872/use-float-or-decimal-for-accounting-application-dollar-amount


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 25 de novembro de 2016 09:31
  • Deleted
    sexta-feira, 25 de novembro de 2016 09:55
  • Eu verifiquei o número de casas pelo label na status bar do SSMS, não iria contar nem a pau rsrs.

    Fiz a pesquisa e o comentário mais pela curiosidade mesmo (não foi uma crítica à sua resposta). No Stackoverflow tiveram pessoas sugerindo o uso do DECIMAL, Float e por mais incrível que possa parecer, o uso de int de 64bit (convertendo para centavos apenas, em caso de valor monetário). 



    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 25 de novembro de 2016 10:16
  • Só para ficar registrado, achei um exemplo bacana sobre grandes valores 

    http://stackoverflow.com/questions/17760956/how-to-convert-float-to-varchar-in-sql

    que contém esse exemplo.

    DECLARE  @Table TABLE
    (
       FloatDefault float,  --Default is 24 bits giving 7 digit precision and 4 bytes storage
       Float24 float(24),   --Max for 4 bytes storage, 24 bits giving 7 digit precision and 4 bytes storage
       Float53 float(53)    --Max for 8 bytes storage, 53 bits giving 15 digit precision and 8 bytes storage
    );
    
    INSERT INTO @Table VALUES(-9223372036854775808, -9223372036854775808, -9223372036854775808); --Max Negative Value of a Big Int
    INSERT INTO @Table VALUES(9223372036854775807, 9223372036854775807, 9223372036854775807);  --Max Positive Value of a Big Int
    INSERT INTO @Table VALUES(-2147483648, -2147483648, -2147483648); --Max Negative Value of a Big Int
    INSERT INTO @Table VALUES(2147483647, 2147483647, 2147483647);  --Max Positive Value of a Big Int
    INSERT INTO @Table VALUES(123456789012345678901234567890, 123456789012345678901234567890, 123456789012345678901234567890);
    INSERT INTO @Table VALUES(123456789012345678901234567890.12345678, 123456789012345678901234567890.12345678, 123456789012345678901234567890.12345678);
    INSERT INTO @Table VALUES(1234567890, 1234567890, 1234567890);
    INSERT INTO @Table VALUES(1234567890.0123456789, 1234567890.0123456789, 1234567890.0123456789);
    INSERT INTO @Table VALUES(22.0/7.0, 22.0/7.0, 22.0/7.0); -- Value of Pi
    INSERT INTO @Table VALUES(1, 1, 1);
    INSERT INTO @Table VALUES(2.0, 2.0, 2.0);
    INSERT INTO @Table VALUES(2000.0, 2000.0, 2000.0);
    
    SELECT 
       FloatDefault,
       Float24,
       Float53,   
      [Coluna 4] = CAST(CAST(Float53  AS NUMERIC(38)) AS VARCHAR(100)), -- 38 is the max precision 
      [Coluna 5] = CAST(CAST(Float53  AS NUMERIC(38,5)) AS VARCHAR(100)), 
      [Coluna 6] =  STR(Float53),
      [Coluna 7] = STR(Float53, 38),
      [Coluna 8] = STR(Float53, 38,5),
      [Coluna 9] = LTRIM(RTRIM(STR(Float53, 38,5))),
      [Coluna 10] =CONVERT(VARCHAR, Float53),
      [Coluna 11] = CONVERT(VARCHAR(100), Float53),
      [Coluna 12]= CONVERT(NUMERIC(38,5), Float53)
    FROM @Table
    GO

    pelo pouco que sei , não existe um tipo (Numéricos exatos) ou (Numéricos aproximados) que comporte esse montante.

    links de estudo

    https://msdn.microsoft.com/pt-br/library/ms187752.aspx


    Wesley Neves

    sexta-feira, 25 de novembro de 2016 11:07
  • Deleted
    sexta-feira, 25 de novembro de 2016 21:43
  • Deleted
    sexta-feira, 25 de novembro de 2016 22:03
  • Muito obrigado José, conseguiu resolver o meu problema, abs.
    sábado, 26 de novembro de 2016 20:59
  • Obrigado pela dica Juliano, estou vendo o StackOverflow. Abs.
    sábado, 26 de novembro de 2016 21:00
  • Olá José,k tudo bem?

    Aproveitando o contato, você consegue me dar uma ajuda na Query abaixo?

    Estou a duas semanas tentando resolver essa Query no trabalho, e não consigo desenvolver ela, até mesmo por que estou iniciando agora no SQL Server.

    O que preciso fazer:

    Eu tenho uma tabela que se chamada Desabilitados com uma lista de clientes que desabilitaram o seu plano e também reabilitaram o seu plano, e com isso eu vou fazer um JOIN em outra tabela que se chamada AGOSTO (Atendimento ao Consumidor).

    Fazendo o JOIN com a tabela AGOSTO eu preciso saber, se o cliente que cancelou a linha na data XX (Tabela Desabilitados), e nessa data/e após essa data quantas vezes esse cliente retornou com o Atendimento ao Consumidor dentro de 3 dias.

    Exemplo, cancelou no dia 01/08/2016 (Preciso saber quantas vezes ele ligou de 01/08/2016 até 03/08/2016).

    Assim também para os clientes que reabilitaram as linhas.

    Obs.: Eu tentei usar o DATEDIFF porém não entendi muito e para que serve, junto com COUNT e GROUP BY.

    -- O que eu consegui fazer até o momento.

    TIPOS DE COLUNA.

    TABELA DESABILITADO----------------------------------------

    PRODUTO (TIPO DE PRODUTO: BANDA LARGA, FONE)

    ATENDIDO (DATA QUE ELE DESABILITOU OU REABILITOU)

    TIPO_SOLICITACAO (DESABILITADO, REABILITADO)

    CONTRATO (CONTRATO DO CLIENTE, QUE LIGA O JOIN)

    TABELA AGOSTO-----------------------------------------------

    NR_CONTRATO (CONTRATO DO CLIENTE, QUE LIGA O JOIN)SK_DATA (DATA QUE LIGOU NO ATENDIMENTO)

    ABAIXO MINHA QUERY:

    SELECT DESB.PRODUTO, DESB.ATENDIDO AS DAT_CANCELAMENTO,

    CASE DESB.TIPO_SOLICITACAO

    WHEN 'REABILITACAO BLOQUEIO’ THEN 'REABILITADO'

    WHEN 'DESAB. PARCIAL THEN 'DESABILITADO'

    ELSE 'NÃO INFORMADO'

    END AS SOLICITACAO,

    CONTRATO = AGO.NR_CONTRATO, DATA_LIGACAO = COUNT(AGO.SK_DATA)

    FROM DESABILITADOS AS DESB INNER JOIN AGOSTO AS AGO

    ON DESB.CONTRATO = AGO.NR_CONTRATO

    GROUP BY DESB.PRODUTO, DESB.ATENDIDO, TIPO_SOLICITACAO, AGO.NR_CONTRATO

    terça-feira, 6 de dezembro de 2016 12:17
  • Deleted
    terça-feira, 6 de dezembro de 2016 13:18
  • Obrigado, já criei.
    terça-feira, 6 de dezembro de 2016 15:28
  • Deleted
    quarta-feira, 7 de dezembro de 2016 10:26