Vamos dar uns toques de SQL? VI

14 Comentários

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.

clip_image001


Para apresentar alguns exemplos utilizei a tabela que temos utilizando nas semanas anteriores (tbl_pplware) que contem os seguintes dados:

clip_image002

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:

clip_image004

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:

clip_image006

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:

clip_image008

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:

clip_image010

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:

clip_image012

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:

clip_image014

Espero que tenham gostado do artigo desta semana, para a semana ha mais.

Partilhar:
Tags:

Comentários

14

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Manuel Silveira

    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,

    1. Avatar de André Flores
      André Flores

      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?

      1. Avatar de Manuel Silveira

        precisamente este código o que faz é ter em linha de conta o mês e ano

    2. Avatar de Nise
      Nise

      Olá Manuel, você poderia me dizer como fazer sua fórmula funcionar na consulta SQL do LibreOffice BASE?

  2. Avatar de Pedro
    Pedro

    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

    1. Avatar de Pedro Gaspar
      Pedro Gaspar

      Desconhecia, como trabalho praticamente so com MySQL, ha umas coisitas que mudam de umas BD para outras 🙂

    2. Avatar de Carlos Correia

      @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.

  3. Avatar de Rafael Cardoso
    Rafael Cardoso

    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 🙂

  4. Avatar de Luís Santos
    Luís Santos

    Está muito bom este artigo.
    Os meus Parabéns Pedro Pinto.

    1. Avatar de Canudo

      [quote]Por Pedro Gaspar para o PPLWARE[/quote]

  5. Avatar de lmx
    lmx

    Boas..
    com vista a uma compatiblidade nas querys, sugeria o uso quase que em absoluto da norma SQL92…
    Bom trabalho 😉

    cmps

  6. Avatar de Bruno Rebelo
    Bruno Rebelo

    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

  7. Avatar de Helder
    Helder

    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

  8. Avatar de Trambulhao
    Trambulhao

    Parabéns..