none
calculo de data RRS feed

  • Pergunta

  • pessoal, tenho uma tabela com informações de cpf, data de nascimento e idade.

    mensalmente eu exporto para csv e uso excel p fazer a conta da idade dos clientes.

    agora a tabela esta com mais de 3kk de registros, ficando muito trabalhoso fazer este procedimento.

    tem como eu deixar para a coluna da idade já calcular altomaticamente?

    ou algum calculo q possa fazer este calculo dentro do sql?

    segue um print com as informacoes da tabela

    sexta-feira, 28 de dezembro de 2018 19:12

Respostas

Todas as Respostas

  • Deleted
    • Não Marcado como Resposta Djacy quarta-feira, 30 de janeiro de 2019 16:26
    sexta-feira, 28 de dezembro de 2018 19:27
  • Desculpe te informar mas essa modelagem está inconsistente,  o campo dia_nasc ,M_S_Nasc e Ano_Nasc

    são redundantes , pois isso vc consegue com o campo Data_Nasc

    A tabela só precisa do campo CPF e Data_Nasc


    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Microsoft® Certified Solutions Associate: SQL 2016 Database Development'),

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

            ('.NET Developer'),

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


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






    Wesley Neves

    sexta-feira, 28 de dezembro de 2018 19:50
  • sim, eu coloquei a data em uma coluna e separei em dia mes e ano cada um em uma respectiva coluna, para poder realizar alguns filtros, por isso a redundância.
    sexta-feira, 28 de dezembro de 2018 21:06
  • Desculpe te informar mas essa modelagem está inconsistente,  o campo dia_nasc ,M_S_Nasc e Ano_Nasc

    são redundantes , pois isso vc consegue com o campo Data_Nasc

    A tabela só precisa do campo CPF e Data_Nasc


    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Microsoft® Certified Solutions Associate: SQL 2016 Database Development'),

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

            ('.NET Developer'),

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


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






    Wesley Neves

    Wesley, 

    Concordo plenamente, na verdade a modelagem esta fora dos padrões de normalização, apresentando dados redundantes, claro que isso pode ser feito, em alguns cenários torna-se necessário trabalhar da maneira que o Djacy esta fazendo, mas pensando no lado relacional temos dados redundantes.


    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]

    sexta-feira, 28 de dezembro de 2018 23:05
  • Djacy,

    Mas isso você pode fazer sem ter a necessidade de criar mais colunas, basta utilizar as funções Da(), Month() e Year() para obter os dados de dia, mês e ano respectivamente.

    Inclusive na sua própria modelagem poderia criar uma coluna calculada que através da coluna DataNascimento, já realiza o cálculo do idade.

    Veja este exemplo:

    Create Table Informacoes
     (Codigo Int Primary Key,
      CPF Varchar(14),
      DataNascimento Date,
      Idade As (DateDiff(Year,DataNascimento,GetDate())))
    Go
    
    Insert Into Informacoes 
     Values (1,'12345678910',GetDate()),
                 (2,'12345678911',GetDate()+365),
                 (3,'12345678912','1980-04-28'),
    	     (4,'12345678911','1981-01-28')
    Go
    
    Select * From Informacoes
    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]

    sexta-feira, 28 de dezembro de 2018 23:19
  • Deleted
    sábado, 29 de dezembro de 2018 16:19
  • Pedro, a função Datediff é ardilosa. Dependendo dos valores e parâmetros, ela retorna valores que podem não ser os esperados.

    A fórmula presente na coluna computada
          DateDiff(Year,DataNascimento,GetDate()))
    não é confiável.

    Suponha que a pessoa tenha nascido em 1/10/2010 e que a data corrente seja 1/3/2018; quantos anos ela tem? 7. Mas se utilizar a fórmula que postou, a resposta seria 8, que não é o valor correto.

    Eis o teste que comprova que a fórmula não é confiável:

    -- código #3
    declare @Hoje date, @Nasc date;
    set @Nasc= convert(date, '1/10/2010', 103);
    set @Hoje= convert(date, '1/3/2018', 103);
    
    SELECT @Nasc as Nascimento, @Hoje as Hoje,
           datediff (year, @Nasc, @Hoje) as Idade;

     

    Foi por isso que no código #1 foi utilizada a construção CASE, de modo a não cair na armadilha.


    José Diz     Belo Horizonte, MG - Brasil     [Linked In]   [e-mail]   [Porto SQL]


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

    José,

    Eu sei disso, somente ilustrei uma possibilidade dele tentar pensar em algo fazendo uso de funções, talvez podemos transformar seu exemplo em uma UDF.


    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]

    sexta-feira, 4 de janeiro de 2019 17:15
  • Pedro, a função Datediff é ardilosa. Dependendo dos valores e parâmetros, ela retorna valores que podem não ser os esperados.

    A fórmula presente na coluna computada
          DateDiff(Year,DataNascimento,GetDate()))
    não é confiável.

    Suponha que a pessoa tenha nascido em 1/10/2010 e que a data corrente seja 1/3/2018; quantos anos ela tem? 7. Mas se utilizar a fórmula que postou, a resposta seria 8, que não é o valor correto.

    Eis o teste que comprova que a fórmula não é confiável:

    -- código #3
    declare @Hoje date, @Nasc date;
    set @Nasc= convert(date, '1/10/2010', 103);
    set @Hoje= convert(date, '1/3/2018', 103);
    
    SELECT @Nasc as Nascimento, @Hoje as Hoje,
           datediff (year, @Nasc, @Hoje) as Idade;

     

    Foi por isso que no código #1 foi utilizada a construção CASE, de modo a não cair na armadilha.


    José Diz     Belo Horizonte, MG - Brasil     [Linked In]   [e-mail]   [Porto SQL]


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

    José,

    Entenda que foi somente um exemplo, não estou dizendo que ele tem que usar minha sugestão ou ideia, mas também temos que fazer com que o usuário imagine possibilidade, independente desta ser ou não a melhor.


    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]

    sexta-feira, 4 de janeiro de 2019 17:16
  • Havia usado dados redundantes na modelagem da tabela, mais apenas para facilitar com alguns filtros posteriores.

    Consegui um calculo seguro dessa forma:

    SELECT CPF, DATA_NASC, 
          datediff(day,DATA_NASC,getdate())/365.15 as idade into tb_idade_ATT   
      from TB_IDADE_JANEIRO

    utilizei o getdate() para substituir a data atual pois colocando a data estava dando algum conflito e o resultado nao era exato, acredito que 

    possa ser algo com formato.


    • Editado Djacy terça-feira, 29 de janeiro de 2019 20:41 solução
    • Marcado como Resposta Djacy quarta-feira, 30 de janeiro de 2019 16:25
    terça-feira, 29 de janeiro de 2019 20:04
  • Deleted
    sábado, 2 de fevereiro de 2019 09:40