Procurando eventos nos últimos 30 dias

Outra tarefa comum é pesquisar linhas que pertencem a um intervalo de datas específico. Em princípio, isso não é difícil se as datas inicial e final do intervalo forem fixas: SQL pode comparar datas tão bem quanto números.

Operadores de comparação podem ser aplicados a datas: < , > , <= , etc. Além disso, existe um operador BETWEEN especial que também pode trabalhar com datas. Por exemplo, vamos escrever uma consulta que selecionará todas as tarefas da tabela de tarefas que precisam ser realizadas no verão de 2022. A solicitação ficará assim:

SELECT * FROM task  
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

O resultado desta consulta será:

eu ia id_funcionário nome prazo final
1 1 Corrigir um bug no front-end 01/06/2022
2 2 Corrigir um bug no back-end 15/06/2022
3 5 comprar café 01/07/2022
4 5 comprar café 01/08/2022

Mas o que escrever na solicitação se quisermos obter tarefas, por exemplo, dos últimos 30 dias. Onde os últimos 30 dias estão diretamente ligados ao tempo de execução da consulta. Ou seja, se a consulta for executada em 25 de julho, você precisará selecionar as datas de 25 de junho a 24 de julho. Como vincular um intervalo de datas à hora atual?

Para fazer isso, use a função de adição de data:

DATE_ADD (date, INTERVAL expression units)

Acho que será mais fácil explicar com alguns exemplos:

# Solicitar Resultado
1 DATE_ADD('2022-06-04', INTERVALO 5 DIAS) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVALO 4 SEMANAS) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVALO 2 MESES) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVALO 5 DIAS) 30/05/2022
6 DATE_SUB('2022-06-04', INTERVALO 4 SEMANAS) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVALO 2 MESES) 2022-04-04

A propósito, um certo número de dias, semanas, meses e anos também pode ser subtraído de uma determinada data.

E se retornarmos ao nosso pedido - para obter dados dos últimos 30 dias, precisaremos de duas datas neste intervalo:

  • CURDATE() - fim do intervalo
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - início do intervalo

A solicitação ficará assim:

SELECT * FROM task WHERE task.deadline  
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

O resultado desta consulta será assim (tenho hoje 4 de junho de 2022):

eu ia id_funcionário nome prazo final
1 1 Corrigir um bug no front-end 01/06/2022

Como encontrar a diferença entre duas datas

E outro recurso útil. Às vezes, pode ser necessário calcular a diferença entre duas datas em dias. Para fazer isso, o SQL possui uma função especial - DATEDIFF ().

É muito fácil trabalhar com ela:

DATEDIFF (date 1, date 2)

A segunda data é simplesmente subtraída da primeira data. Se date2 vier depois de date1, o resultado será negativo.

A propósito, podemos reescrever nossa consulta anterior usando a função DATEDIFF(). Precisamos selecionar todas as tarefas da tabela de tarefas cujo prazo difere da data atual em não mais de 30 dias. Veja como seria essa solicitação:

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30

O resultado desta consulta será assim (tenho hoje 4 de junho de 2022):

eu ia id_funcionário nome prazo final
1 1 Corrigir um bug no front-end 01/06/2022
2 2 Corrigir um bug no back-end 15/06/2022
3 5 comprar café 01/07/2022

Desta vez, o SQL encontrou até três linhas. Pense em por que da última vez havia uma linha e desta vez há três?