Categories
Banco de dados Tutoriais

Como determinar o primeiro e o último dia do mês no MySQL

Conheça algumas abordagens para determinar qual o primeiro ou última dia (do mês ou da semana) no MySQL. As soluções envolvem o uso da função LAST_DAY() e outras.

Dada uma data, você deseja determinar qual o primeiro dia da semana naquele mês ou qual o último dia do mês (28, 29, 30 ou 31).
Veja algumas abordagens para este problema — e use a que melhor lhe convier.
Se você conhece outra solução, dentro do MySQL, sinta-se à vontade para expôr nos comentários.
Logo MySQL - The Dolphin.
Abaixo, veja como resolver o problema usando uma combinação das funções DATE_SUB() e DAYOFMONTH(). Neste caso

SELECT '2016-07-19', DATE_SUB('2016-07-19', INTERVAL DAYOFMONTH('2016-07-19')-1 DAY) AS 'Primeiro dia do mês';
+------------+----------------------+
| 2016-07-19 | Primeiro dia do mês  |
+------------+----------------------+
| 2016-07-19 | 2016-07-01           |
+------------+----------------------+

Obviamente, o primeiro dia de um mês é sempre o dia 01.
Faz mais sentido determinar em que dia da semana cai o primeiro dia do mês. isto pode ser feito com o acréscimo da função DAYOFWEEK():

SELECT '2016-07-19', DAYOFWEEK(DATE_SUB('2016-07-19', INTERVAL DAYOFMONTH('2016-07-19')-1 DAY)) AS 'Primeiro dia do mês';
+------------+----------------------+
| 2016-07-19 | Primeiro dia do mês  |
+------------+----------------------+
| 2016-07-19 |                    6 |
+------------+----------------------+

Sabendo que Domingo é o dia 1, chega-se à conclusão de que o dia 6 é Sexta-feira.
Com a função DAYNAME() fica mais fácil obter esta informação, veja:

SELECT '2016-07-19', DAYNAME(DATE_SUB('2016-07-19', INTERVAL DAYOFMONTH('2016-07-19')-1 DAY)) AS 'Primeiro dia do mês';
+------------+----------------------+
| 2016-07-19 | Primeiro dia do mês  |
+------------+----------------------+
| 2016-07-19 | sexta                |
+------------+----------------------+

A abordagem, que vimos é um tanto complexa e serve apenas para demonstrar algumas funções de manipulação das informações de data do MySQL.
Veja, a seguir, algumas maneiras mais rápidas de obter suas respostas.

Como estabelecer o último dia do mês no MySQL

A função LAST_DAY() pode dar este resultado num piscar de olhos. Sua sintaxe é simples e pede apenas uma data:

SELECT LAST_DAY('2016-02-15') AS 'Últ. dia do mês';
+-------------------+
| Últ. dia do mês   |
+-------------------+
| 2016-02-29        |
+-------------------+

Esta é uma maneira fácil de saber quantos dias o mẽs de Fevereiro terá em um determinado ano.
Você pode aninhar funções e descobrir um pouco mais — por exemplo, em qual dia da semana, cai esta data:

SELECT DAYNAME(LAST_DAY('2016-02-15')) AS 'Últ. dia do mês';
+-------------------+
| Últ. dia do mês   |
+-------------------+
| segunda           |
+-------------------+

A função LAST_DAY() também pode ser usada para determinar a extensão do mês ou o que falta para concluí-lo a partir de uma determinada data.

Como usar a função LAST_DAY para determinar qual o primeiro dia do mês

Ainda não existe a função FIRST_DAY(), no MySQL. E, de certa forma, ela é desnecessária.
O que varia, de mês para mês, é o último dia — que pode ser 28, 29, 30 ou 31.
O primeiro dia de cada mês, é sempre o dia 01 — mas o dia da semana varia, conforme demonstramos no começo deste artigo.
Tecnicamente, o primeiro dia de cada mês é sempre o dia posterior à data retornada por LAST_DAY(), referente ao mês anterior. Por exemplo: LAST_DAY('uma data do mẽs de Março')+1 = primeiro dia do mẽs de Abril.
Veja esta outra solução para determinar o primeiro dia de um determinado mẽs:

SELECT CURDATE( ) AS 'Hoje', ADDDATE(LAST_DAY(SUBDATE(CURDATE(), INTERVAL 1 MONTH)), 1) AS 'Primeiro dia do mês';
+------------+----------------------+
| Hoje       | Primeiro dia do mês  |
+------------+----------------------+
| 2015-07-12 | 2015-07-01           |
+------------+----------------------+

Veja o que fizemos no exemplo acima:

  • subtraímos um mês ao resultados de CURDATE() Para obter o mesmo dia do mês anterior
  • A partir daí usamos a função LAST_DAY() para estabelecer o último dia daquele mês
  • Finalmente, a função ADDDATE() é usada para adicionar um dia ao resultado — o que nos dá o primeiro dia do mẽs subsequente (que é o mês atual)

Este método pode ser usado, sem perigo de obter resultados indesejados, quando datas entre Dezembro e Janeiro de outro ano, estiverem envolvidas na conta.
Para determinar a que dia da semana pertence a data obtida, aninhe a query dentro da função DAYNAME():

SELECT CURDATE( ) AS 'Hoje', DAYNAME(ADDDATE(LAST_DAY(SUBDATE(CURDATE(), INTERVAL 1 MONTH)), 1)) AS 'Primeiro dia do mês';
+------------+----------------------+
| Hoje       | Primeiro dia do mês  |
+------------+----------------------+
| 2015-07-12 | quarta               |
+------------+----------------------+

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

2 replies on “Como determinar o primeiro e o último dia do mês no MySQL”

Elias, suas soluções são incríveis! Adaptei para o BigQuery e funcionaram perfeitamente.

primeiro dia do mes pode ser escrito assim:

select
date(concat(date_format(now(),’%Y-%m’),’-01′)) as primeiro_dia;

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.