Usuário com melhor resposta
calculo de data

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
Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de fevereiro de 2019 16:27
Todas as Respostas
-
-
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-DFhttps://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
-
-
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-DFhttps://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]
-
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]
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 4 de janeiro de 2019 17:14
- Não Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 4 de janeiro de 2019 17:14
-
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]
-
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]
-
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_JANEIROutilizei 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.
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de fevereiro de 2019 16:27