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?
GO TO FULL VERSION