Como Somar Datas no MySQL

Abordaremos neste artigo as seguintes funções nativas do MySQL

  • date_add
    Recomendada para adicionar valores a uma data.
  • date_sub
    Recomendada para reduzir valores a uma data.

Sintaxe
DATE_ADD(date,INTERVAL expr unit)
DATE_SUB(date,INTERVAL expr unit)
Definições da Sintaxe

  1. date (Data)
    Argumento base para o calculo, sendo possível informar datas simples ou completas. (Com ou sem horas, minutos e segundos)¹.
  2. interval (Intervalo)
    Palavra chave da sintaxe.
  3. expr (Expressão)
    Argumento da expressão que será utilizada como intervalo da função, possui tipo de dados do tipo string, que pode começar com menos (-) nos casos de subtração².
  4. unit (Unidade)
    Argumento chave que indica qual unidade de “medida” será usado, anos, dias, meses, horas…

Exemplos (Adição)
1. Adicionando um ano sob a data atual.

 select date_add(now(), interval 1 year)

2. Adicionando um mês sob a data atual

 select date_add(now(), interval 1 month)

3. Adicionando um dia sob a data atual

 select date_add(now(), interval 1 day)

4. Adicionando uma hora sob a data atual

 select date_add(now(), interval 1 hour)

A lista de possibilidades aceitas pelo argumento unit é extensa, veja:

unit ValorEsperado expr Format
MICROSECONDMicrossegundo
SECONDSegundo
MINUTEMinuto
HOURHora
DAYDia
WEEKSemana
MONTHMês
QUARTERTrimestre
YEARAno
SECOND_MICROSECONDSegundo e Microssegundo
MINUTE_MICROSECONDMinuto e Microssegundo
MINUTE_SECONDMinuto e Segundo
HOUR_MICROSECONDHora e Microssegundo
HOUR_SECONDHora e Segundo
HOUR_MINUTEHora e Minuto
DAY_MICROSECONDDia e Microssegundo
DAY_SECONDDia e Segundo
DAY_MINUTEDia e Minuto
DAY_HOURDia e Hora
YEAR_MONTHAno e Mês

Nos exemplos apresentados nós somamos valores a uma data com o uso do now(), mas o curdate() também pode ser utilizado, bem você passar uma data fixa, neste, não se esqueça de colocar as aspas. Agora, se precisa subtrair valores, usamos a função date_sub, vejamos.
Exemplos (Subtração)
1. Subtraindo um ano e um mês sob a data atual.

 select date_sub(now(), interval 1 year_month)

2. Subtraindo um mês sob a data atual

 select date_sub(now(), interval 1 month)

3. Subtraindo um dia e uma hora sob a data atual

 select date_sub(now(), interval 1 day_hour)

4. Subtraindo uma hora e um minuto sob a data atual

 select date_sub(now(), interval 1 hour_minute)
 

Caso seja necessário verificar se a data calculada será um dia útil ou não, podemos contar com o apoio da função para verificar dia útil no MySQL.

Perguntas Frequentes
Posso somar uma data com “select data + tempo”?
Não recomendo, desta forma a especificação do tempo será em segundos, e o tipo de dados resultante será um double que certamente extrapolará o calendário, e você também precisará formatar para um formato amigável, pois o resultado é YYYYMMDDHHMMSS. O mesmo resultado é obtido em casos de subtração.
Existem outras funções semelhante ao date_add ou date_sub?
Sim, o addtime/subtime e o adddate/subdate. Nestes podemos encontrar variações na sintaxe.
Caso tenha ficado alguma dúvida, queira dar uma sugestão ou reclamar também (:d), poste noscomentários, terei o maior prazer em responder, um grande abraço.
¹ Ao se informar somente a hora, minuto e segundo serão adicionados ao resultado, todos sob valores zerados.
² Neste caso, recomendo o uso do date_sub.