MySQL: Somando datas corretamente

Com certa frequência é necessário fazer soma (e subtração) de datas no MySQL mas muitos programadores usam equivocadamente duas funções para tal: now() e curdate() e obtém resultados totalmente diferentes daquilo que estão esperando. Veja aqui como somar e/ou subtrair datas diretamente no banco de dados.

O uso destas funções podem trazer problemas enormes, como é o caso da soma de datas com curdate que extrapolam o calendário. Veja o exemplo abaixo com a soma da data atual mais 120 dias:

> SELECT CURDATE() + 120
> 20071326

(alguém conhece o mês 13 no calendário?)

O correto para a soma e subtração de datas é o uso das funções DATE_ADD e DATE_SUB que conseguem tratar quaisquer datas e retornar resultados corretos. Eis um exemplo:

> SELECT DATE_ADD(CURDATE(), INTERVAL 120 DAY);
> 2008-04-04

Agora sim! Uma data coerente com o calendário gregoriano (4 de Abril de 2008) e que pode ser usada sem medo em qualquer sistema.

Mas porquê usar a função curdate ao invés de now?

A resposta é simples. Now() trás tanto a data quanto a hora, o que não ocorre com a função curdate(), que retorna para o usuário somente a data corrente do servidor, o que é mais indicado para cálculos que envolvam somente datas. Para a soma de horas, minutos e segundos, existem outras funções que fazem este trabalho mas serão comentadas em outro post.Com certa frequência é necessário fazer soma (e subtração) de datas no MySQL mas muitos programadores usam equivocadamente duas funções para tal: now() e curdate() e obtém resultados totalmente diferentes daquilo que estão esperando. Veja aqui como somar e/ou subtrair datas diretamente no banco de dados.

O uso destas funções podem trazer problemas enormes, como é o caso da soma de datas com curdate que extrapolam o calendário. Veja o exemplo abaixo com a soma da data atual mais 120 dias:

> SELECT CURDATE() + 120
> 20071326

(alguém conhece o mês 13 no calendário?)

O correto para a soma e subtração de datas é o uso das funções DATE_ADD e DATE_SUB que conseguem tratar quaisquer datas e retornar resultados corretos. Eis um exemplo:

> SELECT DATE_ADD(CURDATE(), INTERVAL 120 DAY);
> 2008-04-04

Agora sim! Uma data coerente com o calendário gregoriano (4 de Abril de 2008) e que pode ser usada sem medo em qualquer sistema.

Mas porquê usar a função curdate ao invés de now?

A resposta é simples. Now() trás tanto a data quanto a hora, o que não ocorre com a função curdate(), que retorna para o usuário somente a data corrente do servidor, o que é mais indicado para cálculos que envolvam somente datas. Para a soma de horas, minutos e segundos, existem outras funções que fazem este trabalho mas serão comentadas em outro post.

4 comentário em “MySQL: Somando datas corretamente

  1. Carolina

    Bom dia!!!

    Gostaria de fazer uma conta com as datas, mais sendo
    8/10/2009 a 7/04/2010 6horas de jornada

    8/04/2010 a 31/08/2010 6 horas de jornada

    obrigado

  2. Cristofer Sousa

    Estou fazendo um exercicio de mysql na qual ele quer fazer um calculo para viajens de avião que sejam superior a 02 dias e trazer o resultado apenas nessa condição no caso como ficaria minha consulta ?

    Consulta: Mostre os vôos, cidades origem e cidades destino para todos os vôos que durem mais do que 2 dias (considere somente a diferença de datas).

    Ae no caso tenho minha tabelas:

    Cidade (codigo, nome, população)

    Vôo (número, cidade_destino, cidade_origem, distancia, data_partida, hora_partida,
    datachegada, hora_chegada, preço, idAeronave) ,cidade_destino, cidade_origem= FK Cidade(código)

    select cidade_origem, cidade_destino from voo, cidade where
    (c.codigo=cidade_origem) and (SELECT data_partida(CURDATE(), INTERVAL 2 DAY);

    ficaria assim ?

Comentários encerrados.