Последнее обновление
WEEK
Описание
Функция WEEK возвращает номер недели для указанной даты. По умолчанию используется режим 0. Параметр mode позволяет настраивать правила расчёта недель: первый день недели (воскресенье или понедельник), диапазон номеров недель, критерии определения первой недели и т. д.
Влияние параметра mode показано в следующей таблице:
| Режим | Первый день недели | Диапазон номеров недель | Определение первой недели |
|---|---|---|---|
| 0 | Воскресенье | 0-53 | Неделя, содержащая первое воскресенье года |
| 1 | Понедельник | 0-53 | Первая неделя, в которой 4 или более дней относятся к текущему году |
| 2 | Воскресенье | 1-53 | Неделя, содержащая первое воскресенье года |
| 3 | Понедельник | 1-53 | Первая неделя, в которой 4 или более дней относятся к текущему году |
| 4 | Воскресенье | 0-53 | Первая неделя, в которой 4 или более дней относятся к текущему году |
| 5 | Понедельник | 0-53 | Неделя, содержащая первый понедельник года |
| 6 | Воскресенье | 1-53 | Первая неделя, в которой 4 или более дней относятся к текущему году |
| 7 | Понедельник | 1-53 | Неделя, содержащая первый понедельник года |
Поведение этой функции соответствует функции week в MySQL.
Синтаксис
WEEK(`<date_or_time_expr>`)
WEEK(`<date_or_time_expr>`, `<mode>`)
Параметры
| Параметр | Описание |
|---|---|
<date_or_time_expr> | Входное значение даты и времени; поддерживаются типы DATE/DATETIME/TIMESTAMP_NS. О форматах даты и времени см. разделы преобразование даты и времени и преобразование даты |
<mode> | Необязательное значение типа INT, по умолчанию 0. Правило расчёта определяется выражением mode & 7, которое выбирает режим 0-7 из таблицы выше. |
Возвращаемое значение
Возвращает значение типа INT, представляющее номер недели для указанной даты. Конкретный диапазон определяется параметром <mode> (0-53 или 1-53).
- Если
<mode>— целое число вне диапазона 0-7, режим расчёта определяется его тремя младшими битами (mode & 7). Например, 8 выбирает режим 0, 9 выбирает режим 1, а -1 выбирает режим 7; - Если любой из параметров равен NULL, возвращается NULL;
- Для дат на границе годов функция может возвращать номер последней недели предыдущего года (например, 1 января 2023 года в некоторых режимах относится к неделе 52 за 2022 год).
Примеры
Для значений режима вне допустимого диапазона используются три младших бита. Например, 8 выбирает режим 0:
SELECT WEEK('2021-01-01', 8) AS mode_8,
WEEK('2021-01-01', 0) AS mode_0,
WEEK('2021-01-01', 7) AS mode_7;
+--------+--------+--------+
| mode_8 | mode_0 | mode_7 |
+--------+--------+--------+
| 0 | 0 | 52 |
+--------+--------+--------+
-- 2020-01-01 is Wednesday, the first Sunday of the year is 2020-01-05, so it belongs to week 0
SELECT WEEK('2020-01-01') AS week_result;
+-------------+
| week_result |
+-------------+
| 0 |
+-------------+
-- 2020-07-01 is Wednesday, its week contains ≥4 days belonging to 2020, so it's week 27
SELECT WEEK('2020-07-01', 1) AS week_result;
+-------------+
| week_result |
+-------------+
| 27 |
+-------------+
-- Compare mode=0 and mode=3 (differences between different rules)
SELECT
WEEK('2023-01-01', 0) AS mode_0,
WEEK('2023-01-01', 3) AS mode_3;
+--------+--------+
| mode_0 | mode_3 |
+--------+--------+
| 1 | 52 |
+--------+--------+
-- -1 & 7 = 7, so mode 7 is used
SELECT WEEK('2023-01-01', -1) AS week_result;
+-------------+
| week_result |
+-------------+
| 52 |
+-------------+
-- Input is DATETIME type (ignores time portion)
SELECT WEEK('2023-12-31 23:59:59', 3) AS week_result;
+-------------+
| week_result |
+-------------+
| 52 |
+-------------+
-- Any parameter is NULL, result returns NULL
SELECT WEEK('2023-12-31 23:59:59', NULL), WEEK(NULL, 3);
+-----------------------------------+--------------+
| WEEK('2023-12-31 23:59:59', NULL) | WEEK(NULL,3) |
+-----------------------------------+--------------+
| NULL | NULL |
+-----------------------------------+--------------+