none
Dúvida Conversão para Smalldatetime RRS feed

  • Pergunta

  • Amigos,

     

    mais uma vez não estou conseguindo converter um varchar para smalldatetime.

     

    Poderiam ajudar?

     

    Select convert(Smalldatetime, Substring(Det_Arq,4,8),103) From D_Telecobranca_Entrada_Tmp

    Where Substring(Det_Arq,1,1) = 0

     

    terça-feira, 16 de setembro de 2008 21:28

Respostas

  • Olá Daniel,

     

    Se você vai repetir a mesma data para todos os registros não faz sentido utilizar o CASE. Crie uma variável, armazene a data nessa variável e repita-a para todos os registros. Ex:

     

    Code Snippet

    DECLARE @Valor SMALLDATETIME

    SET @Valor = (SELECT <Aquela Formula Toda> FROM Tabela)

    SELECT *, @Valor AS Data FROM Tabela

     

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 17 de setembro de 2008 13:55

Todas as Respostas

  • Boa Tarde,

     

    Quantos registros as consultas abaixo retornam ?

     

    Select count(*) From D_Telecobranca_Entrada_Tmp

    Where Substring(Det_Arq,1,1) = 0 and ISDATE(Substring(Det_Arq,4,8)) = 0

     

    Select count(*) From D_Telecobranca_Entrada_Tmp

    Where Substring(Det_Arq,1,1) = 0

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 16 de setembro de 2008 21:35
  • As duas consultas somente retornou um unico registro.

    quarta-feira, 17 de setembro de 2008 12:02
  • Gustavo,

     

    acho que o erro está acontecendo pq estou utilizando o Case When.

     

     

    Select Case When Substring(Det_Arq,1,1) = 0 Then Convert(Smalldatetime,Substring(Det_Arq,4,8),103)

    End as Dt_Geracao_Arq

    --,Case When Substring(Det_Arq,1,1) = 0 Then Substring(Det_Arq,21,2) End as UF

    From dbo.D_Telecobranca_Entrada_Tmp

     

    quarta-feira, 17 de setembro de 2008 12:15
  • Alves,

     

    Esta ocorrendo alguma falha na conversão?

    quarta-feira, 17 de setembro de 2008 12:26
  • Bom Dia Daniel,

     

    Se as duas consultas retornam um registro, significa que o resultado da Substring não é uma data válida. Qual é o resultado do SELECT abaixo:

     

    Code Snippet

    Select Substring(Det_Arq,4,8) From D_Telecobranca_Entrada_Tmp

    Where Substring(Det_Arq,1,1) = 0

     

     

    [ ]s,

     

    Gustavo

    quarta-feira, 17 de setembro de 2008 12:26
  • O resultado foi esse:

     

    Code Snippet

    06092008

     

     

    Vc viu como eu quero fazer? Estou querendo fazer esse mesmo select que vc pediu para rodar com o Case When.

     

    O erro que está dando é:

    Code Snippet

     

    Msg 8115, Level 16, State 2, Line 1

    Arithmetic overflow error converting expression to data type smalldatetime.

     

     

     

     

    quarta-feira, 17 de setembro de 2008 12:30
  • Alves,

     

    Você quer retornar a data sem os separadores!!!

     

    Se for isso o código que deverá ser utilizado no Getdate para ser como identificador do layout não poderá ser o 103!!!

    quarta-feira, 17 de setembro de 2008 12:33
  • Junior o que estou querendo é pegar esse Varchar Ex: 06092008 converter para Smalldatetime, pois desejo inseri-lo em uma tabela com essa caracteristica(Tipo de dados)

     

    quarta-feira, 17 de setembro de 2008 12:43
  • Bom Dia Daniel,

     

    Inicialmente eu recomendaria a seguinte solução:

     

    SELECT CONVERT(CHAR(10),CAST((RIGHT(Substring(Det_Arq,4,8),4) + SUBSTRING(Substring(Det_Arq,4,8),3,2) + LEFT(Substring(Det_Arq,4,8),2)) AS SMALLDATETIME),103)

    From D_Telecobranca_Entrada_Tmp

    Where Substring(Det_Arq,1,1) = 0

     

    Senão fosse necessário o formato 103 (ou se você pudesse colocar na aplicação), o código seria um pouco mais limpo.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 17 de setembro de 2008 12:46
  •  

    Gustavo o formato 103 pode ser retirado, mas como faço essa conversão no Case When
    quarta-feira, 17 de setembro de 2008 12:55
  • Bom Dia Daniel,

     

    De acordo com a lógica passada, o seu CASE WHEN está inadequado já que não existe condição para o ELSE, ou seja, me parece que a idéia não envolve uma escolha (CASE ou IF) mas sim uma única opção. Se a idéia é converter todos os campos não é preciso utilizar o CASE. Basta converter diretamente.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 17 de setembro de 2008 13:00
  • A ideia não é converter todos os campos. A ideia é pegar somente um pedaço dessa string, ou seja, a data em quetão e repetir para todos os outros registros.

     

    O RESULTADO ESTÁ SENDO ESSE

    Code Snippet

    06/09/2008
    NULL
    NULL
    NULL
    NULL
    NULL
    NULL
    NULL

     

     

    O RESULTADO ESPERADO É:

    Code Snippet

    06/09/2008
    06/09/2008
    06/09/2008
    06/09/2008
    06/09/2008
    06/09/2008

     

     

    quarta-feira, 17 de setembro de 2008 13:35
  • Recebeu Gustavo?

    quarta-feira, 17 de setembro de 2008 13:55
  • Olá Daniel,

     

    Se você vai repetir a mesma data para todos os registros não faz sentido utilizar o CASE. Crie uma variável, armazene a data nessa variável e repita-a para todos os registros. Ex:

     

    Code Snippet

    DECLARE @Valor SMALLDATETIME

    SET @Valor = (SELECT <Aquela Formula Toda> FROM Tabela)

    SELECT *, @Valor AS Data FROM Tabela

     

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 17 de setembro de 2008 13:55
  • Mais uma vez obrigado.

     

    Um grande Abraço.

    quarta-feira, 17 de setembro de 2008 14:09