No MySQL, você pode usar o
WEEK()
função para obter o número da semana para uma determinada data. Por “número da semana” quero dizer a semana do ano. Para usar a função, basta fornecer a data como argumento e o número da semana será retornado.
Você também tem a opção de especificar se deseja iniciar a semana no domingo ou na segunda-feira e se a semana deve estar no intervalo de 0 a 53 ou 1 a 53.
Sintaxe
A sintaxe fica assim:
WEEK(date[,mode])
Onde:
date
é a data da qual você deseja que o número da semana seja retornado.mode
é um número que especifica se a semana deve começar no domingo ou na segunda-feira e se a semana deve estar no intervalo de 0 a 53 ou de 1 a 53. Consulte a tabela abaixo para obter os valores de modo possíveis.
Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
SELECT WEEK('2021-01-25') As 'Week Number';
Resultado:
+-------------+ | Week Number | +-------------+ | 4 | +-------------+
Aqui está um exemplo com uma data próxima ao final do ano.
SELECT WEEK('2021-12-25') As 'Week Number';
Resultado:
+-------------+ | Week Number | +-------------+ | 51 | +-------------+
Exemplo 2 – Especificar um modo
Se você não especificar um segundo argumento, o
WEEK()
função usa o modo conforme especificado pelo default_week_format
variável do sistema. O valor padrão desta variável é 0
. No entanto, você também tem a opção de fornecer um segundo argumento para especificar qual modo usar. Exemplo:
SELECT WEEK('2019-10-17', 7) AS 'Mode 7';
Resultado:
+--------+ | Mode 7 | +--------+ | 41 | +--------+
Os valores de modo possíveis são os seguintes.
Modo | Primeiro dia da semana | Intervalo | A semana 1 é a primeira semana… |
---|---|---|---|
0 | Domingo | 0-53 | com um domingo neste ano |
1 | Segunda-feira | 0-53 | com 4 ou mais dias este ano |
2 | Domingo | 1-53 | com um domingo neste ano |
3 | Segunda-feira | 1-53 | com 4 ou mais dias este ano |
4 | Domingo | 0-53 | com 4 ou mais dias este ano |
5 | Segunda-feira | 0-53 | com uma segunda-feira neste ano |
6 | Domingo | 1-53 | com 4 ou mais dias este ano |
7 | Segunda-feira | 1-53 | com uma segunda-feira neste ano |
Para valores de modo em que a semana 1 é a primeira semana “com 4 ou mais dias este ano”, as semanas são numeradas de acordo com a ISO 8601:1988:
- Se a semana que contém 1º de janeiro tiver 4 ou mais dias no novo ano, será a semana 1.
- Caso contrário, é a última semana do ano anterior e a próxima semana é a semana 1.
Exemplo 3 – Comparação de Modos
Aqui está uma rápida comparação de como você pode obter resultados diferentes dependendo do modo que está sendo usado.
Os três exemplos a seguir usam o mesmo código, mas com três datas diferentes. Essas datas são consecutivas – ocorrem nos dias 5, 6 e 7 de janeiro. Como você pode ver, os resultados podem ser bastante diferentes dependendo da data exata e do modo que está sendo usado.
Data 1
SET @date = '2019-01-05'; SELECT WEEK(@date, 0) AS 'Mode 0', WEEK(@date, 1) AS 'Mode 1', WEEK(@date, 2) AS 'Mode 2', WEEK(@date, 3) AS 'Mode 3', WEEK(@date, 4) AS 'Mode 4', WEEK(@date, 5) AS 'Mode 5', WEEK(@date, 6) AS 'Mode 6', WEEK(@date, 7) AS 'Mode 7';
Resultado:
+--------+--------+--------+--------+--------+--------+--------+--------+ | Mode 0 | Mode 1 | Mode 2 | Mode 3 | Mode 4 | Mode 5 | Mode 6 | Mode 7 | +--------+--------+--------+--------+--------+--------+--------+--------+ | 0 | 1 | 52 | 1 | 1 | 0 | 1 | 53 | +--------+--------+--------+--------+--------+--------+--------+--------+
Data 2
SET @date = '2019-01-06'; SELECT WEEK(@date, 0) AS 'Mode 0', WEEK(@date, 1) AS 'Mode 1', WEEK(@date, 2) AS 'Mode 2', WEEK(@date, 3) AS 'Mode 3', WEEK(@date, 4) AS 'Mode 4', WEEK(@date, 5) AS 'Mode 5', WEEK(@date, 6) AS 'Mode 6', WEEK(@date, 7) AS 'Mode 7';
Resultado:
+--------+--------+--------+--------+--------+--------+--------+--------+ | Mode 0 | Mode 1 | Mode 2 | Mode 3 | Mode 4 | Mode 5 | Mode 6 | Mode 7 | +--------+--------+--------+--------+--------+--------+--------+--------+ | 1 | 1 | 1 | 1 | 2 | 0 | 2 | 53 | +--------+--------+--------+--------+--------+--------+--------+--------+
Data 3
SET @date = '2019-01-07'; SELECT WEEK(@date, 0) AS 'Mode 0', WEEK(@date, 1) AS 'Mode 1', WEEK(@date, 2) AS 'Mode 2', WEEK(@date, 3) AS 'Mode 3', WEEK(@date, 4) AS 'Mode 4', WEEK(@date, 5) AS 'Mode 5', WEEK(@date, 6) AS 'Mode 6', WEEK(@date, 7) AS 'Mode 7';
Resultado:
+--------+--------+--------+--------+--------+--------+--------+--------+ | Mode 0 | Mode 1 | Mode 2 | Mode 3 | Mode 4 | Mode 5 | Mode 6 | Mode 7 | +--------+--------+--------+--------+--------+--------+--------+--------+ | 1 | 2 | 1 | 2 | 2 | 1 | 2 | 1 | +--------+--------+--------+--------+--------+--------+--------+--------+