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.
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 | +------------+----------------------+
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;