Estou usando este sql para fazer um group by no MySQL 5.7, quando quero agrupar por mês:
select
max(statistic_time) as statistic_time
from home_overview_daily
group by date_format(FROM_UNIXTIME(statistic_time/1000), '%Y-%m')
order by statistic_time desc
mas quando eu agrupo por semana:
select
max(statistic_time) as statistic_time
from home_overview_daily
group by date_format(FROM_UNIXTIME(statistic_time/1000), '%Y-%m-%w')
order by statistic_time desc
os dados do resultado ficam assim:
1640789999999 2021-12-3
1640703599999 2021-12-2
1640617199999 2021-12-1
1640530799999 2021-12-0
1640444399999 2021-12-6
1640357999999 2021-12-5
1640271599999 2021-12-4
1638284399999 2021-11-2
1638197999999 2021-11-1
1638111599999 2021-11-0
1638025199999 2021-11-6
1637938799999 2021-11-5
1637852399999 2021-11-4
1637765999999 2021-11-3
por que o mês 12 tem 7 semanas? onde estou errando? Estou usando o formato assim %Y-%m-%u
:
select
max(statistic_time) as statistic_time,
date_format(FROM_UNIXTIME(statistic_time/1000), '%Y-%m-%u')
from home_overview_daily
group by date_format(FROM_UNIXTIME(statistic_time/1000), '%Y-%m-%u')
order by statistic_time desc
mas o resultado ficou assim:
1640789999999 2021-12-52
1640530799999 2021-12-51
1639925999999 2021-12-50
1639321199999 2021-12-49
1638716399999 2021-12-48
1638284399999 2021-11-48
1638111599999 2021-11-47
1637506799999 2021-11-46
1636901999999 2021-11-45
1636297199999 2021-11-44
cada mês tem 5 semanas?
Os números de semana são controlados por
%u
,%U
e especificadores da%v
string de formato. O valor retornado está no intervalo 0(1)-53. Para agrupar por semana, você precisa de um formato de data como .%V
date_format
%Y-%u
%w
especificador está representando o número do dia dentro da semana.e assim por diante.
Uma abordagem é olhar para as semanas, ignorando os limites de ano e mês:
n
é algum número entre 0 e 6, com base nesse dia da semana é "primeiro".w
é um número de semana.Em seguida, trabalhe para trás para descobrir em qual data essa semana começa:
Exemplo:
(Não use variáveis @; elas são usadas aqui para facilitar a demonstração.)