none
Converter String em Data - Campo Texto RRS feed

  • Pergunta

  • Olá pessoal! 

    Gostaria de uma ajuda que já tentei solucionar de todas as formas e conversões possíveis.

    Tenho um campo no meu banco onde retiro parte da string ( a parte é uma data em formato de texto), e tento fazer essa informação virar Data mas não consigo de forma alguma.

    Uso uma função para extaria a parte do texto que preciso e depois tento converte -lo em Data, mas acredito pelo tipo de campo o SQL não consegue fazer a conversão.

    Texto gravado (a parte sublinhada e italica, é a que preciso) - Type Columns(text):

    @#3785@29&Nenhum@#3785@24&Falha na dispensação de materiais@#3785@3&@#3785@40&Near Miss@#3785@1&30/01/2020@#3785@48&Entre 13h às 19h@#3785@6&Branca@#3785@5&FARMÁCIA@#3785@2&28/01/2020@#3785@30&No momento do procedimento cirúrgico, médico verificou que o PI dispensado pela farmácia não era o solicitado (dispensado PI comum e solicitado PI de córnea curva).

    As tentativas abaixo funcionam:

    campo: dbo.f_resultado_rcl (rcl_txt, '3785', '1')

    CONVERT(BINARY, dbo.f_resultado_rcl (rcl_txt, '3785', '1')) AS 'BINARY', 

    CAST (CONVERT(BINARY, dbo.f_resultado_rcl (rcl_txt, '3785', '1')) AS VARCHAR) AS 'VARCHAR',

    'Está tentativa não funciona'

     CAST(CAST (CONVERT(BINARY, dbo.f_resultado_rcl (rcl_txt, '3785', '1')) AS VARCHAR) AS INTEGER)

    'Msg exibida: Conversion failed when converting the varchar value '30/01/2020....................' to data type int.'

    Alguém tem uma função ou query simples onde retiro aquela parte do texto informada acima e consiga transforma ela em data?



    • Editado TI Núcleo segunda-feira, 29 de junho de 2020 15:15
    segunda-feira, 29 de junho de 2020 15:13

Todas as Respostas

  • se dbo.f_resultado_rcl (rcl_txt, '3785', '1') tras 30/01/2020 tenta convert(date,dbo.f_resultado_rcl(rcl_txt,'3785','1'),103)

    • Editado Avatar SQL segunda-feira, 29 de junho de 2020 15:25
    segunda-feira, 29 de junho de 2020 15:23
  • Isso já tentei também, neste caso acima que mostrou ele apenas coloca o formato de data no campo, mas ele não é um campo convertido para data, pois quando tento compara ele com m

    String do meu campo              Data do seu convert

    30/01/2020                       -       2020-01-30

    Mas quando uso o campo com seu convert para comparar por ex.: com getdate() ele dá erro de conversão:

    'Linha no Where para comparar as datas':
    Convert(date,dbo.f_resultado_rcl(rcl_txt,'3785','1'),103) >= CONVERT (date, GETDATE(), 103)

    Msg: 'Conversion failed when converting date and/or time from character string.'

    segunda-feira, 29 de junho de 2020 15:29
  • Boa tarde,

    Desconfio que este erro esteja ocorrendo porque a sua função pode estar retornando uma data inválida com algumas linhas da sua tabela.

    Experimente fazer um teste acrescentando a função IsDate. Ex:

    set dateformat dmy;
    
    select -- ...
    
    where 
        ISDATE(dbo.f_resultado_rcl(rcl_txt,'3785','1')) = 1 AND
        Convert(date, dbo.f_resultado_rcl(rcl_txt,'3785','1'), 103) >= CAST(GETDATE() as date)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex segunda-feira, 29 de junho de 2020 18:00
    segunda-feira, 29 de junho de 2020 17:57
  • Sim, na verdade se eu tirar o filtro para aparecer todos os registros, vi que alguns estão trazendo outros dados além da informação que precisam trazer, mas isto já estou solucionando.

    Mas o problema problema de conversão permanece. rsrsrs

    segunda-feira, 29 de junho de 2020 18:01
  • Você fez uns testes deixando a sua query conforme o exemplo que postei?

    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 29 de junho de 2020 18:14
  • TI Nucleo,

    Poderia nos retornar por exemplo uma pequena porção dos seus dados para que seja possível entender melhor os resultados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 29 de junho de 2020 22:50
  • Junior Galvão, vou detalhar melhor para o entendimento ficar mais claro:

    Estou usando essa função criada no banco para extrair os dados de uma determina parte do texto no Banco (Onde os parametros são: campo (RCL_TXT), Arvore('0000') e Atributo('00'), sendo assim chamo a função dessa forma de exemplo: dbo.f_resultado_rcl (rcl_txt, '3785', '1').

    Segue o query da *Function* abaixo:

    FUNCTION [dbo].[F_RESULTADO_RCL] (@TEXTO_RCL VARCHAR (8000), @DESCRITOR VARCHAR (8000), @ATRIBUTO VARCHAR (8000))
    RETURNS VARCHAR (8000)
    AS
    BEGIN
    
    DECLARE @TEXTO_RCL_VARCHAR VARCHAR (8000);
    DECLARE @RESULTADO VARCHAR (8000);
    
    SET @TEXTO_RCL_VARCHAR = @TEXTO_RCL;
    
    SET @RESULTADO = 
    CASE 
    WHEN CHARINDEX ('@#' + @DESCRITOR + '@' + @ATRIBUTO, @TEXTO_RCL_VARCHAR) <= 0
    THEN '?' 
    ELSE
    CASE 
    WHEN CHARINDEX ('@', SUBSTRING ( @TEXTO_RCL_VARCHAR, CHARINDEX ('@#' + @DESCRITOR + '@' + @ATRIBUTO, @TEXTO_RCL_VARCHAR) + LEN ( '@#' + @DESCRITOR + '@' + @ATRIBUTO) + 1 , 8000 ), LEN ( '@#' + @DESCRITOR + '@' + @ATRIBUTO) + 1) = 0
    THEN SUBSTRING ( @TEXTO_RCL_VARCHAR, CHARINDEX ( '@#' + @DESCRITOR + '@' + @ATRIBUTO, @TEXTO_RCL_VARCHAR) + LEN ( '@#' + @DESCRITOR + '@' + @ATRIBUTO) + 1, 8000 ) 
    ELSE SUBSTRING ( SUBSTRING ( @TEXTO_RCL_VARCHAR, CHARINDEX ('@#' + @DESCRITOR + '@' + @ATRIBUTO, @TEXTO_RCL_VARCHAR) + LEN ( '@#' + @DESCRITOR + '@' + @ATRIBUTO) + 1, 8000 ) , 1, CHARINDEX ('@', SUBSTRING ( @TEXTO_RCL_VARCHAR, CHARINDEX ('@#' + @DESCRITOR + '@' + @ATRIBUTO, @TEXTO_RCL_VARCHAR) + LEN ( '@#' + @DESCRITOR + '@' + @ATRIBUTO) + 1, 8000 )) - 1 ) 
    END 
    END; 
    
    SET @RESULTADO =
    CASE
    WHEN CHARINDEX ('@', @RESULTADO) = 0
    THEN @RESULTADO
    ELSE SUBSTRING (@RESULTADO, 1, CHARINDEX ('@', @RESULTADO) - 1)
    END;
    
    RETURN @RESULTADO;
    
    END
    
    GO

    A query executada no Select:

    SELECT COUNT(*) AS 'QTDE', 
           CONVERT (CHAR(10), dbo.f_resultado_rcl (rcl_txt, '12090', '22'), 103) AS 'DATA'
    
    FROM RCL
    
    WHERE (  RCL.RCL_STAT IN ( 'I','L','X')) AND 
          (  RCL.RCL_COD IN ('CMR2', 'CM12', 'CM22' ) ) AND 
          (  CONVERT(CHAR(10), dbo.f_resultado_rcl (rcl_txt, '12090', '22'), 103) <= CONVERT(CHAR(10), GETDATE() ,103) ) AND
          ( dbo.f_resultado_rcl (rcl_txt, '12090', '22') NOT IN ('', '?', '@') )
    
    GROUP BY CONVERT (CHAR(10), dbo.f_resultado_rcl (rcl_txt, '12090', '22'), 103)
    
    ORDER BY DATA

    Resultado:

    Qtde |       Data

      1     |  01/02/2020

      5     | 20/07/2020

      3     | 03/04/2020

      2     | 11/10/2020

    O problema é que como podem ver no resultado, o campo não é um campo de data, pois a ordenação das datas não está correta. Ainda continua como String.

    Se conseguir compreender o meu problema e me ajudar, vou lhe agradecer eternamente rsrs!

    Desde já obrigado pela atenção.


    • Editado TI Núcleo terça-feira, 30 de junho de 2020 16:46
    terça-feira, 30 de junho de 2020 16:46
  • Vc precisa reescrever a funcao.

    CREATE FUNCTION [dbo].[F_RESULTADO_RCL] (@TEXTO_RCL VARCHAR (8000), @DESCRITOR VARCHAR (8000), @ATRIBUTO VARCHAR (8000))
    RETURNS VARCHAR (8000)
    AS
    BEGIN
    declare @resultado varchar(8000),@pesq varchar(200),@i int,@loc int,@fimloc int
    set @pesq='@#'+@DESCRITOR+'@'+@ATRIBUTO+'&';set @i=len(@pesq)
    set @loc=charindex(@pesq,@TEXTO_RCL)
    if @loc>0 begin
    set @fimloc=charindex('@#', @TEXTO_RCL+'@#', @loc+@i)
    if (@fimloc>(@i+@loc)) set @resultado=substring(@TEXTO_RCL,@loc+@i,(@fimloc - @loc - @i))
    else set @resultado=''
    end
    else set @resultado='?'
    return ltrim(rtrim(@resultado))
    end
    go
    ----------------------------------------
    select dbo.f_resultado_rcl(rcl_txt,'3785','1'),convert(date,dbo.f_resultado_rcl(rcl_txt,'3785','1'),103) from rcl

    terça-feira, 30 de junho de 2020 20:50
  • TI Núcleo,

    Certo, eu entendi sim, mas neste caso, temos que analisar o código fonte da função F_Resultado_RCL, pois os dados estão sendo manipulados nela.

    Porque você não tenta realizar a conversão das datas diretamente na função?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 30 de junho de 2020 22:39
  • nao tem erro em  convert(date,dbo.f_resultado_rcl(rcl_txt,'3785','1'),103) 

    o erro esta na funcao f_resultado_rcl ou nos dados. Ou nos dois...

    terça-feira, 30 de junho de 2020 23:51
  • Obrigado pelo retorno, mas não posso fazer a conversão diretamente na função como pode ver no conteúdo do campo da tabela que ela traz(RCL_TXT), eu posso pegar vários atributos dependendo do resultado que quero. Ex: Quero todos que estejam escrito "Nenhum", então alteraria na função busca para trazer a informação dessa forma: Tabela RCL_TXT: @#3785@29&Nenhum, puxaria essa informação assima: dbo.f_resultado_rcl(rcl_txt,'3785','29'), sendo assim puxaria todos que tivessem essa informação, por isso não posso tratar isto diretamente dentro da função, pois posso pegar qualquer parte dentro do texto para servir como busca de um select, vai depender do que o cliente está querendo ver no relatório. Por isso estou tentando uma solução fora da função. 

    Em contato com o desenvolvedores do sistema me passaram um Script para tentar extrair os dados da mesma forma que a função faz para executar no select, só que fora do texto (Só que não foi funcional):

    CASE WHEN PATINDEX ( '%' + '@#' + '30145' + '@' + '1' + '' + '%', rcl.rcl_txt ) <= 0 THEN '?' ELSE 
    CASE WHEN PATINDEX ( '%@%', SUBSTRING ( rcl.rcl_txt, PATINDEX ( '%' + '@#' + '30145' + '@' + '1' + '' + '%', rcl.rcl_txt ) + LEN ( '@#' + '30145' + '@' + '1' + '' ), 1000 ) ) = 0 THEN 
    SUBSTRING ( rcl.rcl_txt, PATINDEX ( '%' + '@#' + '30145' + '@' + '1' + '' + '%', rcl.rcl_txt ) + LEN ( '@#' + '30145' + '@' + '1' + '' ), 1000 ) ELSE 
    SUBSTRING ( SUBSTRING ( rcl.rcl_txt, PATINDEX ( '%' + '@#' + '30145' + '@' + '1' + '' + '%', rcl.rcl_txt ) + LEN ( '@#' + '30145' + '@' + '1' + '' ), 1000 ) , 1, PATINDEX ( '%@%', SUBSTRING ( rcl.rcl_txt, PATINDEX ( '%' + '@#' + '30145' + '@' + '1' + '' + '%', rcl.rcl_txt ) + LEN ( '@#' + '30145' + '@' + '1' + '_' ), 1000 ) ) - 1 ) 
    END 
    END

     


    • Editado TI Núcleo quinta-feira, 2 de julho de 2020 11:41
    quinta-feira, 2 de julho de 2020 11:39
  • TI Nucleo,

    Certo, certo, neste caso, penso que poderíamos tentar trazer estes dados para uma tabela auxiliar ou até mesmo temporária e realizar os devidos tratamentos se necessários nela.

    Pense nesta possibilidade, ao invés de ficar tentar você tratar os dados, podemos armazenar de forma direta em uma estrutura já preparada de acordo com cada respectivo tipo de dados e depois fazer o consumo da mesma.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 2 de julho de 2020 22:52
  • Olá Junior e os demais que deram suas respostas muito interessantes para meu caso, mas conseguimos resolver devido a urgência dessa forma:

    CONVERT(DATETIME,SUBSTRING( [dbo].[F_RESULTADO_RCL] (RCL_TXT,'12090', '22'),1 ,10 ), 103 ) 

    Muito obrigado pelo retorno de atenção de todos no meu problema.

    Grato.

    segunda-feira, 6 de julho de 2020 17:04
  • Olá Junior e os demais que deram suas respostas muito interessantes para meu caso, mas conseguimos resolver devido a urgência dessa forma:

    CONVERT(DATETIME,SUBSTRING( [dbo].[F_RESULTADO_RCL] (RCL_TXT,'12090', '22'),1 ,10 ), 103 ) 

    Muito obrigado pelo retorno de atenção de todos no meu problema.

    Grato.

    isso q eh gambiarra  rss

    o erro esta na funcao f_resultado_rcl ou nos dados. Ou nos dois...


    • Editado Avatar SQL terça-feira, 7 de julho de 2020 18:16
    terça-feira, 7 de julho de 2020 10:38
  • Eu sei que é gambiarra... mas parece que vou ter que mexer mesmo porque tem outras coisas que está dando problema.
    sexta-feira, 10 de julho de 2020 18:48
  • Eu sei que é gambiarra... mas parece que vou ter que mexer mesmo porque tem outras coisas que está dando problema.

    comece por reescrever a funcao f_resultado_rcl. teste o script dela que postei.

    if erros continuarem then corrija os dados

    segunda-feira, 13 de julho de 2020 11:25