none
ignorar datas (em char) com formato errado RRS feed

  • Pergunta

  • ola..

    estou tentando fazer um SELECT que utiliza no WHERE uma data que fica armazenado num campo do tipo CHAR, existem registros em que esta data esta num formato errado e o SQLSERVER retorna erro quando tento utliza-las:

    Server: Msg 242, Level 16, State 3, Line 1
    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

     

    não posso excluir estes registros com as datas inconsistentes, como faço para ignora-los quando estou fazendo um select???

     

    exemplo:

    tenho a tabela 'TB_TESTE' com o campo 'DATA' que é do tipo CHAR(8)...

    insert into tb_teste (data)
    values('06/06/06')  -- data correta

    insert into tb_teste (data)
    values('99/12/06') -- data  incorreta (retorna out-of-range date time) , não deve retornar no select

     

    fazer um select que retorne os registros com data superior a '20060101'...

    tentei assim:

    select  convert(char, CONVERT(datetime, data), 112) AS wdata
    from TB_TESTE  where isdate(data)= 1 and convert(char, CONVERT(datetime, data), 112)  >= '20060606'

    retorna o erro: Server: Msg 242, Level 16, State 3, Line 1
    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

     

    tentei tambem fazer uma gambiarra com select de select... mas ocorreu o mesmo erro...

    select * from (
    select convert(char, CONVERT(datetime, data), 112) AS wdata
    from tb_teste where isdate(data)= 1
    ) SE
    where wdata >= '20060606'

     

    alguem tem alguma ideia de que posso fazer?

     

    sexta-feira, 12 de janeiro de 2007 12:12

Respostas

  • veja se assim ajuda

     

     drop table #exemplo
     create table #exemplo (campo char(10))

     insert into #exemplo (campo) Values ('20060606')
     insert into #exemplo (campo) Values ('20060706')
     insert into #exemplo (campo) Values ('20060806')
     insert into #exemplo (campo) Values ('20063306') -- para dar erro
     insert into #exemplo (campo) Values ('') -- para dar erro


     Select convert(datetime,campo,113) campo
     From #exemplo where case when isdate(campo) = 1 then campo else '19000101' End = '20060606'

     


     

    Abs;

    sexta-feira, 12 de janeiro de 2007 13:27

Todas as Respostas

  • vc. pode usar um isdate

     

    select * from campo where isdate(campo) = 1

     

    Abs;

    sexta-feira, 12 de janeiro de 2007 12:19
  • select  convert(char, CONVERT(datetime, data), 112) AS wdata
    from TB_TESTE  where isdate(data)= 1 and convert(char, CONVERT(datetime, data), 112)  >= '20060606'

     

    mas mesmo assim ocorre erro, mesmo que a primeira condição seja FALSA (0) o sqlserver tenta verificar a segunda condição (acabei de esquecer o nome disto... rsrsrs), e ocorre o erro...

    sexta-feira, 12 de janeiro de 2007 12:28
  • e assim ?

     

    select  convert(char(10), data) AS wdata
    from TB_TESTE  where isdate(data)= 1 and CONVERT(datetime, data)  >= '20060606'

     

    Abs;

    sexta-feira, 12 de janeiro de 2007 12:42
  • retorna o mesmo erro...

    sexta-feira, 12 de janeiro de 2007 13:17
  • veja se assim ajuda

     

     drop table #exemplo
     create table #exemplo (campo char(10))

     insert into #exemplo (campo) Values ('20060606')
     insert into #exemplo (campo) Values ('20060706')
     insert into #exemplo (campo) Values ('20060806')
     insert into #exemplo (campo) Values ('20063306') -- para dar erro
     insert into #exemplo (campo) Values ('') -- para dar erro


     Select convert(datetime,campo,113) campo
     From #exemplo where case when isdate(campo) = 1 then campo else '19000101' End = '20060606'

     


     

    Abs;

    sexta-feira, 12 de janeiro de 2007 13:27
  • assim funcionou... ja tinha testado algo parecido com isto, mas acho q tinha feito algo de errado...¬¬

     

    vlw

    sexta-feira, 12 de janeiro de 2007 13:39
  •  

    Estou com o mesmo problema, mas apenas ao efetuar o comando insert e update em campo smalldatetime.

    Acredito que seja o formato de data do SQL, pois notei que a data está no formato mm/dd/yyyy. Porém não descobri como fazer esta alteração no SQL 2005.

    domingo, 14 de janeiro de 2007 00:04
  •  

     verifique o default language do usuario que vc. usa para se conectar com o sql server, veja por exemplo se estiver portuguese vc. deve passar a data dd/mm/aaaa se estiver ingles vc. deve passar mm/dd/aaaa

     

    Abs;

    segunda-feira, 15 de janeiro de 2007 09:03