none
Utilizando variáveis no SELECT RRS feed

  • Pergunta

  • Prezados, boa tarde.

    Estou habituado com outros códigos (VBA e Python) onde o uso de variáveis é mais simples. No SQL com o uso do DECLARE e SET eu me confundo.

    A dúvida é o seguinte:

    Tenho no meio do meu select, um concatenado que forma uma data de nascimento. Pois no BD, a data vem crua (01012018)

    Meu código faz o seguinte:

                    

    SELECT

    SUBSTRING(CONVERT(CHAR(8),FUDTNASC),7,2) + '/' + SUBSTRING(CONVERT(CHAR(8),FUDTNASC),5,2) + '/' + SUBSTRING(CONVERT(CHAR(8),FUDTNASC),1,4) AS DATA_NASCIMENTO

    FROM FUNCIONA

    Visando organizar o código, tal como o José me instruiu aqui no fórum. Há como eu isolar esse concatenado fora do SELECT?

    A ideia é usar simplesmente um:

    SELECT
    
    @DTADM AS DATA_ADMISSAO
    
    FROM FUNCIONA

    Mas não sei se faço o DECLARE numa CTE, antes do SELECT, depois do SELECT, enfim...

    terça-feira, 6 de fevereiro de 2018 18:04

Respostas

Todas as Respostas

  • Tavares_LR,

        Pelo que eu entendi você quer fazer a junção das 'strings', dia, mês e ano fora do SELECT e depois passar só a variável... é isso? Se for isso:

        O "Declare" precisa saber qual é o 'tipo' de variável.

        Exemplo:

    DECLARE @DTADM AS DATETIME; 

        E NÃO vai funcionar assim:

    DECLARE @DTADM AS DATETIME; 
    set @DTADM = SUBSTRING(CONVERT(CHAR(8),FUDTNASC),7,2) + '/' + 
                 SUBSTRING(CONVERT(CHAR(8),FUDTNASC),5,2) + '/' +
                 SUBSTRING(CONVERT(CHAR(8),FUDTNASC),1,4)
    SELECT
     @DTADM  AS DATA_NASCIMENTO
    FROM FUNCIONA

        Por que o "Declare" não sabe o que é "DatCriacaoRegistro" (que é o campo da tabela).

    =============================

    DECLARE (Transact-SQL)
    https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/declare-local-variable-transact-sql

    =============================

        Só se for algo assim:

    DECLARE @DTADM AS DATETIME; 
    
     SELECT @DTADM = convert(datetime,
    	SUBSTRING(CONVERT(CHAR(8),FUDTNASC),7,2) + '/' + 
    	SUBSTRING(CONVERT(CHAR(8),FUDTNASC),5,2) + '/' +
    	SUBSTRING(CONVERT(CHAR(8),FUDTNASC),1,4), 103) AS DATA_NASCIMENTO
    FROM FUNCIONA

    =============================

    CAST e CONVERT (Transact-SQL)
    https://docs.microsoft.com/pt-br/sql/t-sql/functions/cast-and-convert-transact-sql

    =============================

    []'s,
    Fabio I.

    • Editado Fabio I terça-feira, 6 de fevereiro de 2018 19:04
    • Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 7 de fevereiro de 2018 11:31
    terça-feira, 6 de fevereiro de 2018 18:52
  • Tavares_LR,

        Pelo que eu entendi você quer fazer a junção das 'strings', dia, mês e ano fora do SELECT e depois passar só a variável... é isso?

    É exatamente isso.

    No código que passou:

    DECLARE @DTADM AS DATETIME; SELECT @DTADM = convert(datetime, SUBSTRING(CONVERT(CHAR(8),FUDTNASC),7,2) + '/' + SUBSTRING(CONVERT(CHAR(8),FUDTNASC),5,2) + '/' + SUBSTRING(CONVERT(CHAR(8),FUDTNASC),1,4), 103) AS DATA_NASCIMENTO FROM FUNCIONA

    O código para se chegar na data ainda estão dentro do SELECT.

    Minha intenção é não estender o SELECT, deixando-o mais organizado tirando esses códigos extensos.

    terça-feira, 6 de fevereiro de 2018 19:41
  • Bom dia  Tavares_LR,

    poste o  resultado ,para avaliarmos como está armazenado o conteúdo do seu campo

    SELECT TOP 10 FUDTNASC FROM FUNCIONA

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 7 de fevereiro de 2018 09:59
  • Bom dia  Tavares_LR,

    poste o  resultado ,para avaliarmos como está armazenado o conteúdo do seu campo

    SELECT TOP 10 FUDTNASC FROM FUNCIONA


    Bom dia Wesley, segue resultado:

    FUDTNASC 	
    19780613 	
    19790716 	
    19690123 	
    19710703 	
    19670530 	
    19681219 	
    19540327 	
    19710909 	
    19870424 	
    19601013 	     	
             	
             	
    

    AAAA/MM/DD

    Aí no meu código eu ponho em ordem (DD/MM/AAAA) e adiciono as '/', mas além de deixar o SELECT muito grande, toda vez que eu precisar dessa data (para fazer um DATEDIFF, por exemplo) terei que ficar repetindo o código, ou seja, cada vez mais meu SELECT fica maior.

    quarta-feira, 7 de fevereiro de 2018 11:07
  • Bom dia , vc pode emcapsular esse codigo para uma função e reaproveitar a mesma logica quando precisar

    veja o exemplo 

    1) criei um resultado com os dados que vc nos passou 

    DECLARE @Campos TABLE (Valor VARCHAR(20));
    
    INSERT INTO @Campos (Valor)
    VALUES ('19780613'),
    ('19790716'),
    ('19690123'),
    ('19710703'),
    ('19670530'),
    ('19681219'),
    ('19540327'),
    ('19710909'),
    ('19870424'),
    ('19601013');
    

    2) Vc pode criar uma função para resolver a conversão;

    CREATE FUNCTION FormatData (@data DATE)
    RETURNS VARCHAR(10)
    WITH RETURNS NULL ON NULL INPUT
    BEGIN
        RETURN (CONVERT(VARCHAR, CONVERT(DATE, @data, 103), 103));

    3) veja o resultado

    SELECT ValorOriginal = C.Valor,
     [ValorConvertido para Data] =	CONVERT(DATE, C.Valor,103),
     [ValorConvertido para Varchar] = CONVERT(varchar,CONVERT(DATE, C.Valor,103),103),
     [Data Formatada Na Função] = dbo.FormatData(C.Valor)
      FROM @Campos AS C;

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 7 de fevereiro de 2018 11:25
  • Tavares_LR,

    Este campo que esta armazenando os valores de data esta utilizando qual tipo de dados.

    Somente como curiosidade execute este bloco de código:

    SELECT TOP 10 Convert(Varchar(10),FUDTNASC,103) FROM FUNCIONA
    Go
    
    SELECT TOP 10 Convert(Varchar(10),FUDTNASC,102) FROM FUNCIONA
    Go


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

    • Sugerido como Resposta Fabio I quarta-feira, 7 de fevereiro de 2018 15:55
    quarta-feira, 7 de fevereiro de 2018 11:33
  • Bom dia , vc pode emcapsular esse codigo para uma função e reaproveitar a mesma logica quando precisar

    Eu infelizmente não consigo criar ou inserir dados em tabelas, pois meu acesso é limitado a consultas no BD, só consigo extrair e trabalhar em cima daquele dado.

    As funções INSERT e TABLE não funcionam.



    Este campo que esta armazenando os valores de data esta utilizando qual tipo de dados.

    Somente como curiosidade execute este bloco de código:

    SELECT TOP 10 Convert(Varchar(10),FUDTNASC,103) FROM FUNCIONA
    Go
    
    SELECT TOP 10 Convert(Varchar(10),FUDTNASC,102) FROM FUNCIONA
    Go

    Segue resultado:

            	
    19780613	
    19790716	
    19690123	
    19710703	
    19670530	
    19681219	
    19540327	
    19710909	
    19870424	
    19601013	
            	
            	
            	
            	
            	
            	
    

    quarta-feira, 7 de fevereiro de 2018 11:53
  • Tavares,

    O resultado veio desta forma?

    Sinceramente tem algo fora do normal, qual é a versão do SQL Server que você esta utilizando?

    Você processou o código em qual ferramenta? Por acaso você tem acesso ao Management Studio?


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

    quarta-feira, 7 de fevereiro de 2018 12:01
  • Tavares,

    O resultado veio desta forma?

    Sinceramente tem algo fora do normal, qual é a versão do SQL Server que você esta utilizando?

    Você processou o código em qual ferramenta? Por acaso você tem acesso ao Management Studio?


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

    Eu não utilizo do SQL Server, são sistemas de folha de pagamento (FPW e RM LABORE) com módulos SQL para consultas e exportações.

    Por este módulo eu rodo querys e desenvolvo relatórios gerenciais.




    • Editado Tavares_LR quarta-feira, 7 de fevereiro de 2018 12:34
    quarta-feira, 7 de fevereiro de 2018 12:25
  • Vc ja tentou isso

    SELECT TOP 10 FUDTNASC,
           [Formatado] = CONVERT(VARCHAR, CONVERT(DATE, FUDTNASC, 103), 103)
      FROM FUNCIONA;

    posta por favor o resultado dessas configurações

     SELECT '@@VERSION',@@VERSION
    
    	   SELECT '@@LANGUAGE',@@LANGUAGE
    
    	   SELECT D.name,D.compatibility_level,D.collation_name FROM sys.databases AS D
    	   WHERE D.database_id = DB_ID()

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quarta-feira, 7 de fevereiro de 2018 12:36
  • Vc ja tentou isso

    SELECT TOP 10 FUDTNASC,
           [Formatado] = CONVERT(VARCHAR, CONVERT(DATE, FUDTNASC, 103), 103)
      FROM FUNCIONA;


    Apareceu este erro: Não é permitida a conversão explícita do tipo de dados int em date




    posta por favor o resultado dessas configurações

     SELECT '@@VERSION',@@VERSION
    
    	   SELECT '@@LANGUAGE',@@LANGUAGE
    
    	   SELECT D.name,D.compatibility_level,D.collation_name FROM sys.databases AS D
    	   WHERE D.database_id = DB_ID()

    O resultado é esse:

              	
    @@VERSION
              	
              	
              	




    >Mas se a coluna FUDTNASC estiver declarada como char(8), ou varchar(8), e com a data no formato aaaammdd, o código pode ser simplificado para

    -- código #1
    ...
    SUBSTRING(FUDTNASC, 7, 2) + '/' + SUBSTRING(FUDTNASC, 5, 2) + '/' + SUBSTRING(FUDTNASC, 1, 4) AS DATA_NASCIMENTO
    ...
     

    Pelo jeito não, pois deu este erro: Tipo de dados de argumento int inválido para o argumento 1 da função substring

    e também pode utilizar

          convert(char(10), convert(date, FUDTNASC, 112), 103) as DATA_NASCIMENTO

    para obter o mesmo resultado, desde que na coluna FUDTNASC exista uma data correta.

    -----

    Sempre que necessitar de converter o conteúdo da coluna FUDTNASC de string para date, pode utilizar


    Acho que essas datas estão todas em INT, pois sempre que uso DATE ele da esse erro: Não é permitida a conversão explícita do tipo de dados int em date

    ---

    Acho que vou ter que converter essa data de INT para CHAR e depois converter para DATE, certo?

    ---

    Edit: 13:20

    Consegui converter este campo para DATE da seguinte forma:

    SELECT
    
    CONVERT(DATE, CONVERT(VARCHAR(10), FUDTNASC, 112), 103) AS DATA_NASC
    
    FROM FUNCIONA

    Pois conforme falei, descobri que o campo de data é cadastrado como INT, então não vai direto pra DATE, sendo necessária a conversão para CHAR antes.

    Isso vai economizar o MUITO código, pois assim não vai necessitar dos inúmeros concatenados.


    • Editado Tavares_LR quarta-feira, 7 de fevereiro de 2018 15:23
    quarta-feira, 7 de fevereiro de 2018 14:02

  • -- código #2 v2
    ...
          convert(char(10), convert(date, convert(char(8), FUDTNASC), 112), 103) as DATA_NASCIMENTO
    ...

     

    E o código #3 para

    -- código #3
    SELECT top (10) 
           convert(char(10), convert(date, convert(char(8), FUDTNASC), 112), 103) as DATA_NASCIMENTO,
           datediff(year, convert(date, convert(char(8), FUDTNASC), 112), current_timestamp) as IDADE
      from FUNCIONA;



    Agora funcionou!

    Com o código que eu tinha testado, a conversão final ficou em DATE, aí então o DATEDIFF estava dando erro na conversão em INT.

    Com o seu código#2, a conversão final ficou em string, mas formatado adequadamente (103), concluindo assim o DATEDIFF perfeitamente.

    Assim o código ficou menor porém mais funcional que antes, na mesma linha e nem precisou de variáveis, show de bola!

    Muito obrigado a todos que contribuíram: Fábio, Junior, Wesley e obrigado José por mais uma vez me salvar!!!

    quarta-feira, 7 de fevereiro de 2018 16:41