Vamos dar uns toques de SQL? VI
Por Pedro Gaspar para o PPLWARE
Esta semana vamos aprender mais algumas funções novas, desta vez relacionadas com datas.
Vamos tentar descobrir a idade das pessoas que temos na nossa base de dados, aprender a fazer contas, entre outras coisas.
Para apresentar alguns exemplos utilizei a tabela que temos utilizando nas semanas anteriores (tbl_pplware) que contem os seguintes dados:
Começando pelo inicio, o sql é uma linguagem bastante abrangente, alem de nos permitir fazer operações com tabelas, também nos permite fazer operações matemáticas.
EXEMPLO1
Objectivo: Listar o nome e:
- o valor do nascimento + 2
- o valor do nascimento - 2
- o valor do nascimento multiplicado por 2
- o valor do nascimento dividido por 2
Query:
SELECT nome, nascimento +2 AS soma, nascimento -2 AS subtracao, nascimento *2 AS multiplicacao, nascimento /2 AS divisao FROM tbl_ppware |
Resultado:
Fazer contas com SQL e bastante fácil! Agora para complicar um pouco mais, vamos fazer contas com datas.
O próprio SQL consegue ir buscar a data actual ao sistema onde esta a ser executado, para ir buscar essa informação utilizamos a função NOW() (outras funções de data e hora podem ser consultadas aqui), a data é-nos apresentada no formato “ano-mês-dia hora:minuto:segundo”
Query:
SELECT NOW( ) |
Resultado:
Esta e a forma considerada universal de apresentar a data, e se pensar-mos bem até e a que faz mais sentido. No entanto como somos europeus e gostamos também bastante da nossa forma e-nos possível também alterar a forma como a data ira ser apresentada, para isso utilizamos a função DATE_FORMAT(), que nos permite mostrar a data de outra forma completamente a nossa escolha, podem consultar a informação completa sobre esta função aqui
EXEMPLO2
Objectivo: Apresentar a data no formato europeu
Query:
SELECT DATE_FORMAT( NOW( ) , "%d/%m/%y" ) AS DATA |
Resultado:
Pegando novamente na nossa tabela vamos então calcular a idade das nossas pessoas ?
No lugar de utilizar o DATE_FORMAT para obter o ano actual (e assim calcular a idade) vou utilizar a função YEAR(), esta função devolve-nos apenas o ano e serve plenamente para o nosso exemplo.
EXEMPLO3
Objectivo: Apresentar o nome e a idade das pessoas
Query:
SELECT nome, YEAR( NOW( ) ) - nascimento AS idade FROM `tbl_ppware` |
ou:
SELECT nome, DATE_FORMAT( NOW( ) , '%Y' ) - nascimento AS idade FROM `tbl_ppware` |
Resultado:
Assim como existe a função YEAR(), tambem existem a função DAY() para dias e MONTH() para meses, todas elas podem ser consultadas aqui
Com estas mesmas funções também podemos fazer contas com datas, por exemplo somar meses ou dias a uma determinada data
EXEMPLO4
Objectivo: Somar um dia, uma semana, um mês e um ano a data 21/12/2012, e apresenta-la por extenso (em inglês)
Primeiro que mais nada temos que converter esta data para um formato em que o SQL a reconheça, para isso utilizamos a função STR_TO_DATE()
Query:
SELECT DATE_FORMAT( STR_TO_DATE( '21/12/2012', '%d/%m/%Y' ) + INTERVAL 1 DAY + INTERVAL 1 WEEK + INTERVAL 1 MONTH + INTERVAL 1 YEAR, '%D %M of %Y' ) AS DATA |
Resultado:
EXEMPLO5
Objectivo: Obter a media de idades das pessoas que temos na nossa base de dados
A media consiste em somar todos os elementos e no fim dividir pelo numero desses mesmos elementos, logo e isso mesmo que teremos que fazer, para obter a idade das pessoas que temos na nossa tabela vamos utilizar a mesma forma que utilizamos no EXEMPLO3, de seguida utilizaremos a função SUM(), para somar todos os resultados obtidos, e por fim dividimos pelo numero de elementos utilizados, para obter o numero desses exemplo usamos a função COUNT()
Query:
SELECT SUM( YEAR( NOW( ) ) - nascimento ) / COUNT( * ) AS media FROM `tbl_ppware` |
Resultado:
Espero que tenham gostado do artigo desta semana, para a semana ha mais.
Este artigo tem mais de um ano
Acompanho o pplware à bastante tempo, mas apenas como leitor. Contudo como a minha área de trabalho atual é o Mysql, achei que também podia dar uma dica nesta secção.
Já que falamos em datas um problema que me deparo muitas vezes é calcular a idade correta, não apenas por subtração de anos, e deixo aqui o mysql que utilizo para isso:
SELECT DATE_FORMAT(NOW(), ‘%Y’) – DATE_FORMAT(‘1974-08-17’, ‘%Y’) – (DATE_FORMAT(NOW(), ’00-%m-%d’) < DATE_FORMAT('1974-08-17', '00-%m-%d')) AS idade;
sendo que 17-8-1974 é a data de nascimento do indivíduo que queremos saber quantos anos tem agora (Now()).
Continuem que esta dedicação,
Uma questão:
Calcula a idade com base no dia e mes? ou meramente nos anos?
Uma pessoa que fizer anos em 13/08/2011 que nasceu em 1980 terá actualmente 30 anos certo e não 31, correcto?
precisamente este código o que faz é ter em linha de conta o mês e ano
Olá Manuel, você poderia me dizer como fazer sua fórmula funcionar na consulta SQL do LibreOffice BASE?
Duas coisas:
Now() não é reconhecido em SQL,apenas em MySQL. Para obter a data actual no SQL usa-se
select getdate() -> 2011-07-02 18:21:29.623
Para formatar temos duas hipóteses em SQL, cast e convert
select cast(getdate() as varchar(10)) – >Jul 2 201
select convert(varchar(50), getdate(),105) -> 02-07-2011
105 é o formato dd/mm/yyyy, mais formatos aqui:http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx
Desconhecia, como trabalho praticamente so com MySQL, ha umas coisitas que mudam de umas BD para outras 🙂
@Pedro:
Duas correções:
O standard ANSI é “CURRENT_TIMESTAMP”. É implementada por TODOS os SGBDs que conheço (de cor, ocorrem-me o Oracle, PostgreSQL, DB2, além do próprio MS SQL).
A função “getdate()” é que parece ser específica do MS SQL, “herdada” do Sybase, no qual é baseado.
Quanto à formatação de datas, fico feliz por não ter recorrer a coisas tão esotéricas como “formata esta data com o padrão 105” e poder usar o date_format.
Tendo em conta que a base de dados é da pplware, falta um ‘l’ na base de dados definida embora que o código se encontre correcto 🙂
Está muito bom este artigo.
Os meus Parabéns Pedro Pinto.
[quote]Por Pedro Gaspar para o PPLWARE[/quote]
Boas..
com vista a uma compatiblidade nas querys, sugeria o uso quase que em absoluto da norma SQL92…
Bom trabalho 😉
cmps
Calcular a idade com base no Dia /Mes /Ano:
SELECT year(getdate()) – year(@BirthDate)-
case
when month(getdate()) < month(@BirthDate) then 1
when month(getdate()) = month(@BirthDate) and day(getdate()) < day(@BirthDate) then 1
else 0
end
Pedro,
Ao que me parece estão-se aqui a confundir duas coisas. O artigo tem por titulo falar de SQL e o que tu fazes em muitas situações é falar em MySQL.
São coisas diferentes. Acho que em futuros artigos deverias dar primeiramente os exemplos em ANSI-SQL e só depois apresentá-los nas diversas variantes que existem (Mysql, T-SQL, etc…)
De resto, excelente ideia esta.
Cumps
Parabéns..