none
ERRO CONVERSÃO INT VARCHAR RRS feed

  • Pergunta

  • Estou com erro na conversão do meu case:

    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value ',' to data type int   

    ****JÁ SEI QUE O ERRO ESTÁ NA JUNÇÃO DE HORAS + VARCHAR + MINUTOS.

    MAS COMO CORRIGIR ?

    SELECT

    WHEN RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) < 35        AND RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) >= 35  THEN  CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) AS INT) + ',' + CAST(RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) AS VARCHAR(50)) WHEN RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) >=  35 AND  RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) < 35 THEN  CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) AS INT) + ',' + CAST(RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) AS VARCHAR(50)) ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    END THARREDONDADA

     FROM TABELA


    SQL2008.



    Droberti

    quinta-feira, 17 de outubro de 2019 14:41

Respostas

  • A mensagem de erro que ocorreu

        Conversion failed when converting the varchar value '6,50' to data type int.

    se deve a uma conversão implícita causada por este trecho
        ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    A função DATEDIFF() retorna valor numérico enquanto que os 2 THEN anteriores retornam texto. Esta foi a causa. Detalhes no artigo “Os perigos da conversão implícita”.

    ---

    Altere então
        ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    para
       ELSE cast (DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) as varchar(10))


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


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

    • Marcado como Resposta espertometal quinta-feira, 17 de outubro de 2019 17:01
    quinta-feira, 17 de outubro de 2019 16:54

Todas as Respostas

  • Como estão declaradas as colunas HORAINI e HORAFIM?

    ---

    O erro é porque está a concatenar valores numéricos com texto.

    Substitua
       CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) AS INT)

    por
      CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) as varchar(10))

    ---

    Cuidado com as conversões implícitas, como esta:
        RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) < 35

    Observe que é comparado um texto (o resultado da expressão) com um número (35).

    Detalhes no artigo “Os perigos da conversão implícita”.

    ---

    Se você explicar qual é o objetivo do trecho de código, talvez seja possível propor soluções alternativas mais simples.

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


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

    • Editado José Diz quinta-feira, 17 de outubro de 2019 15:05
    quinta-feira, 17 de outubro de 2019 14:54
  • Agora deu esse erro:

    Conversion failed when converting the varchar value '6,50' to data type int.



    Droberti

    quinta-feira, 17 de outubro de 2019 14:57
  • Agora deu esse erro:
    Conversion failed when converting the varchar value '6,50' to data type int.
    No trecho de código que você copiou para este tópico não há conversão para INT que contenha vírgula. O erro foi causado por alguma outra parte que não consta neste tópico.

    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


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

    • Editado José Diz quinta-feira, 17 de outubro de 2019 15:06
    quinta-feira, 17 de outubro de 2019 15:05
  • PRECISO APENAS SOMAR HORAS E ARRENDONDAR PRA CIMA ESSAS HORAS





    SELECT 
    CONVERT(VARCHAR,X.DATA,103) DATA,
    MIN(X.HORAINI) ENTRADA,
    MIN(X.HORAFIM) SAIDA,
    DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) TOTALHORAS,


    CASE  

    WHEN RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) < 35  AND RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) >= 35 
    THEN  CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) as varchar(10)) + ',' + CAST(RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) AS VARCHAR(50))
    WHEN RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) >=  35  AND  RIGHT(CONVERT(VARCHAR,MAX(X.HORAFIM),108),2) < 35
    THEN  CAST(DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) as varchar(10)) + ',' + CAST(RIGHT(CONVERT(VARCHAR,MIN(X.HORAINI),108),2) AS VARCHAR(50))
    ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    END THARREDONDADA

    FROM TABELA A  
    JOIN TABELA  B ON ON B_ID = A_ID 



    MEU CASE PRECISA TRAZER 

    ENTRADA FOR  08:00  E SAIDA FORA 20:00 ( VALOR REDONDO ) PRECISA TRAZER THARREDONDADA = 12
    ENTRADA FOR  08:00  E SAIDA FORA 20:30 ( VALOR REDONDO ) PRECISA TRAZER THARREDONDADA = 11,5
    ENTRADA FOR  08:30  E SAIDA FORA 20:30 ( VALOR REDONDO ) PRECISA TRAZER THARREDONDADA = 12
    ENTRADA FOR  08:30  E SAIDA FORA 20:00 ( VALOR REDONDO ) PRECISA TRAZER THARREDONDADA = 1,5
    ENTRADA FOR  08:20  E SAIDA FORA 20:30 ( VALOR REDONDO ) PRECISA TRAZER THARREDONDADA = 11,5


    Droberti

    quinta-feira, 17 de outubro de 2019 16:16
  • A mensagem de erro que ocorreu

        Conversion failed when converting the varchar value '6,50' to data type int.

    se deve a uma conversão implícita causada por este trecho
        ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    A função DATEDIFF() retorna valor numérico enquanto que os 2 THEN anteriores retornam texto. Esta foi a causa. Detalhes no artigo “Os perigos da conversão implícita”.

    ---

    Altere então
        ELSE DATEDIFF(HOUR,X.HORAINI,X.HORAFIM)

    para
       ELSE cast (DATEDIFF(HOUR,X.HORAINI,X.HORAFIM) as varchar(10))


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


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

    • Marcado como Resposta espertometal quinta-feira, 17 de outubro de 2019 17:01
    quinta-feira, 17 de outubro de 2019 16:54
  • Isso mesmo.

    O problema estava no else.... o código aqui está tão grande e estou minimizando para processar menos, mas quando chegou nessa parte deu uma travada.

    Muito Obrigado!!!


    Droberti

    quinta-feira, 17 de outubro de 2019 17:02