none
Conversão FLOAT - INT RRS feed

  • Pergunta

  • Srs, bom dia.

    Preciso de ajuda com uma coisa que pode ser óbvia.

    Inicialmente eu tenho uma procedure (PROCEDURE ORIGINAL) que aciona outra procedure (PROCEDURE 1), recebendo os dados numa tabela temporária.

    Peguei o código da PROCEDURE 1 e coloquei diretamente na PROCEDURE ORIGINAL, criando a PROCEDURE ALTERADA.

    O que acontece é que apenas fazendo isso tenho resultados diferentes quando converto um campo FLOAT para INT, utilizando o SELECT abaixo. 
    Na procedure original, tudo que é <5  se mantém. Tudo que é >=5 é arredondado pra baixo.

    Na procedure Altarada tudo o que é <5 é arredondado para baixo e tudo o que é >= 5 se mantém.

    SELECT CONVERT(INT, quantidade *1000)

    Alguém consegue me ajudar?

    Obrigada.



    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    terça-feira, 21 de novembro de 2017 13:12

Todas as Respostas

  • Na proc original e alterada os tipo que definem a tabela temporária, estão iguais?
    terça-feira, 21 de novembro de 2017 14:02
  • Sim. Em ambos o campo é FLOAT. Exatamente a mesma estrutura.

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    terça-feira, 21 de novembro de 2017 14:04
  • Olá Mariana,

    "Tudo que é >=5 é arredondado pra baixo.". Não entendi, é isso mesmo?

    Poderia postar os dados de exemplo com as casas decimais?


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    terça-feira, 21 de novembro de 2017 14:41
  • Vinicius, boa tarde.

    O exemplo do resultado está na figura que postei.

    Na proc original fica assim o resultado do select (SELECT CONVERT(INT, Quantidade*1000))

    >= 5

    13,036 -> 13035

    < 5
    4,882 -> 4882

    Enquanto na proc alterada:

    >= 5

    13,036 -> 13036

    < 5
    4,882 -> 4881


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    terça-feira, 21 de novembro de 2017 15:25
  • posta o tipo de dados com precisão da coluna Quantidade na tabela que vc recupera e o tipo de dados na tabela que temporária , por favor

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.com/
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"






    Wesley Neves

    terça-feira, 21 de novembro de 2017 17:04
  • Wesley, o campo Quantidade é FLOAT, tanto na tabela física que é origem dos dados, quanto na tabela temporária que recebo esses dados.

    A única coisa que mudei é que ao invés de eu popular essa tabela temporária através de um "EXEC PROC" como na procedure original, eu copiei o select da PROC 1 e fiz um INSERT/SELECT. Nada mais!

    Arranquei da PROC 1 e coloquei o código idêntico na PROC ALTERADA.

     Máquina é a mesma, mesmo database... tudo igual.. apenas movi o código pra fora da PROC 1

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */


    • Editado Mariana Del Nero terça-feira, 21 de novembro de 2017 17:14 Correção
    terça-feira, 21 de novembro de 2017 17:11
  • Achei isso aqui e ok! Faz sentido. Mas porque tenho comportamento diferente dentro da proc e com um select fora dela?

    https://stackoverflow.com/questions/4398700/converting-sql-float-to-sql-int-lost-data


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    terça-feira, 21 de novembro de 2017 17:18
  • Deleted
    quarta-feira, 22 de novembro de 2017 09:44
  • Bom dia José,

    "é gerada em PO, sendo utilizada como forma de comunicação entre PO e o procedimento 1 (P1)?"

    É isso! Ela é criada na PO recebendo os dados que a PROC 1 retorna.

    Obrigada.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 22 de novembro de 2017 11:37
  • Mariana Del Nero,

    Se você forçar na query com a opção ROUND (Transact-SQL),talvez consiga obter os mesmos resultados para as duas procedures.


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 22 de novembro de 2017 20:09
  • Roberto, obrigada pela resposta.

    Eu posso até ter soluções que contornem, mas preciso entender isso.
    Pra mim não faz sentido o que está acontecendo. Nunca vi nada assim e por isso vim até o fórum.

    Obrigada.

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 22 de novembro de 2017 22:25
  • Deleted
    sexta-feira, 24 de novembro de 2017 11:03
  • José, muito obrigada pela ajuda, mas os resultados não refletem exatamente o que estou vendo.

    Notei uma coisa no plano de execução. Comparei os XMLs e temos a seguinte diferença:

    PROC Original

    

    PROC ALTERADA

    Fiquei mais perdida ainda, pois os campos exibidos são exatamente os mesmos.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */


    • Editado Mariana Del Nero sexta-feira, 24 de novembro de 2017 16:48 Complemento
    sexta-feira, 24 de novembro de 2017 16:38
  • Deleted
    sexta-feira, 24 de novembro de 2017 18:15
  • Bom dia,

    Por falta de retorno essa thread está sendo encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 27 de novembro de 2017 13:04
    Moderador