Сообщить об ошибке.

MySQL: Функции для работы с датой и временем

В этом разделе описываются функции, которые можно использовать для управления временными значениями, для описания диапазона значений каждого типа даты и времени и допустимых форматов, в которых значения могут быть указаны.

Пример, в котором используются функции даты. Следующий запрос выбирает все строки со значением date_col за последние 30 дней:

mysql> SELECT something FROM tbl_name
    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

Запрос также выбирает строки с датами, которые лежат в будущем.

Функции, которые ожидают значения даты, обычно принимают значения даты и времени и игнорируют часть времени. Функции, которые ожидают значения времени, обычно принимают значения даты и времени и игнорируют часть даты.

Некоторые функции даты можно использовать с "нулевыми" датами или неполными датами, такими как '2001-11-00', тогда как другие не могут. Функции, которые извлекают части дат, обычно работают с неполными датами и, таким образом, могут возвращать 0, когда в противном случае можно было бы ожидать ненулевое значение. Например:

mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
        -> 0, 0

Другие функции ожидают полных дат и возвращают NULL для неполных дат. К ним относятся функции, которые выполняют арифметические операции с датами или сопоставляют части дат с именами. Например:

mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
        -> NULL
mysql> SELECT DAYNAME('2006-05-00');
        -> NULL

Содержание:


ADDDATE(date, INTERVAL expr unit)
ADDDATE(date, days):

При вызове ADDDATE() с ключевым словом INTERVAL, функция является синонимом для DATE_ADD(). Родственная функция SUBDATE() является синонимом DATE_SUB(). Сведения об аргументе единицы unit смотрите в разделе "Встроенные БД MySQL интервалы времени".

mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY);
        -> '2008-02-02'
mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY);
        -> '2008-02-02'

При вызове с другой формой передачи аргумента MySQL обрабатывает его как целое число дней, которое нужно добавить к expr.

mysql> SELECT ADDDATE('2008-01-02', 31);
        -> '2008-02-02'

Эта функция возвращает значение NULL, если значение date или days равно NULL.

ADDTIME(expr1,expr2):

MySQL функция ADDTIME() добавляет expr2 к expr1 и возвращает результат. Аргумент expr1 - это выражение TIME или DATETIME, а expr2 - выражение времени TIME. Возвращает NULL, если expr1 или expr2 имеет значение NULL.

Начиная с MySQL 8.0.28 (узнать версию SELECT VERSION();), тип возвращаемого значения этой функции и функции SUBTIME() определяется следующим образом:

  • Если первый аргумент является динамическим параметром (например, в подготовленном операторе), то тип возвращаемого значения TIME.
  • В противном случае разрешенный тип функции получается из разрешенного типа первого аргумента.
mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');
        -> '2008-01-02 01:01:01.000001'
mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
        -> '03:00:01.999997'

CURDATE(),
CURRENT_DATE():

MySQL функция CURDATE() (CURRENT_DATE()) возвращает текущую дату в виде значения в формате 'YYYY-MM-DD' или YYYYMMDD, в зависимости от того, используется ли функция в строковом или числовом контексте.

mysql> SELECT CURDATE();
        -> '2022-06-30'
mysql> SELECT CURDATE() + 0;
        -> 20220630

CURTIME([fsp]),
CURRENT_TIME([fsp]):

MySQL функция CURTIME() (CURRENT_TIME()) возвращает текущее время в виде значения в формате 'hh:mm:ss' или hhmmss, в зависимости от того, используется ли функция в строковом или числовом контексте. Значение выражается в часовом поясе сеанса.

Если аргумент fsp задан (необязательный) для указания точности в дробных секундах от 0 до 6, то возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.

mysql> SELECT CURTIME();
        -> 19:25:37

mysql> SELECT CURTIME() + 0;
        -> 192537

mysql> SELECT CURTIME(3);
        -> 19:25:37.840

DATE(expr):

MySQL функция DATE() извлекает часть даты из выражения expr. Возвращает значение NULL, если expr равно NULL.

mysql> SELECT DATE('2022-12-31 01:02:03');
        -> '2022-12-31'

DATEDIFF(expr1, expr2):

MySQL функция DATEDIFF() возвращает expr1 − expr2, выраженное в виде значения в днях от одной даты до другой. выражения expr1 и expr2 являются выражениями даты или даты и времени. В вычислении используются только части значений, относящиеся к дате.

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
        -> 1
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31

Функция возвращает NULL, если expr1 или expr2 имеют значение NULL.

DATE_ADD(date, INTERVAL expr unit),
DATE_SUB(date, INTERVAL expr unit):

Эти функции выполняют арифметические операции с датами. Аргумент date указывает начальную дату или значение даты и времени. Аргумент expr - это выражение, определяющее значение интервала, которое нужно добавить или вычесть из начальной даты. Выражение expr оценивается как строка, может начинаться с минуса - для отрицательных интервалов. Ключевое слово unit указывает единицы измерения, в которых следует интерпретировать выражение.

Дополнительные сведения о синтаксисе временного интервала, включая полный список спецификаторов единиц измерения, ожидаемую форму аргумента expr для каждого значения единицы измерения и правила интерпретации операндов во временной арифметике, смотрите в главе "Встроенные БД MySQL интервалы времени".

Возвращаемое значение зависит от аргументов:

  • Если date равна NULL, то функция возвращает NULL.
  • DATE, если аргумент date является значением DATE и расчеты включают только части YEAR, MONTH и DAY (то есть без частей времени).
  • TIME, если аргумент date является значением TIME, и вычисления включают только части HOURS, MINUTES и SECONDS (то есть без частей даты). (MySQL 8.0.28 и более поздние версии:)
  • DATETIME, если первым аргументом является значение DATETIME (или TIMESTAMP), или если первым аргументом является DATE, а значение единицы измерения использует HOURS, MINUTES или SECONDS, или если первый аргумент имеет тип TIME, а значение единицы измерения использует YEAR, MONTH или DAY.
  • Если первый аргумент является динамическим параметром (например, подготовленного оператора), его разрешенный тип - DATE, если второй аргумент - это интервал, содержащий некоторую комбинацию YEAR, MONTH или DAY только ценности. В противном случае его тип - DATETIME. (MySQL 8.0.28 и более поздние версии:)
  • иначе cтрока (тип VARCHAR).

Примечание. В версиях MySQL с 8.0.22 по 8.0.27 при использовании в подготовленных операторах эти функции возвращали значения DATETIME независимо от типов аргументов. (Ошибка № 103781)

Чтобы убедиться, что результатом является DATETIME, можно использовать CAST() для преобразования первого аргумента в DATETIME.

mysql> SELECT DATE_ADD('2018-05-01', INTERVAL 1 DAY);
        -> '2018-05-02'
mysql> SELECT DATE_ADD('2022-10-01', INTERVAL 3 MONTH) - INTERVAL 10 DAY;
        -> '2022-12-22'
mysql> SELECT DATE_SUB('2022-10-01', INTERVAL 3 MONTH) + INTERVAL 10 DAY;
        -> '2022-07-11'
mysql> SELECT DATE_SUB('2018-05-01', INTERVAL 1 YEAR);
        -> '2017-05-01'
mysql> SELECT DATE_ADD('2020-12-31 23:59:59',
    ->                 INTERVAL 1 SECOND);
        -> '2021-01-01 00:00:00'
mysql> SELECT DATE_ADD('2018-12-31 23:59:59',
    ->                 INTERVAL 1 DAY);
        -> '2019-01-01 23:59:59'
mysql> SELECT DATE_ADD('2100-12-31 23:59:59',
    ->                 INTERVAL '1:1' MINUTE_SECOND);
        -> '2101-01-01 00:01:00'
mysql> SELECT DATE_SUB('2025-01-01 00:00:00',
    ->                 INTERVAL '1 1:1:1' DAY_SECOND);
        -> '2024-12-30 22:58:59'
mysql> SELECT DATE_ADD('1900-01-01 00:00:00',
    ->                 INTERVAL '-1 10' DAY_HOUR);
        -> '1899-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
        -> '1997-12-02'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
    ->            INTERVAL '1.999999' SECOND_MICROSECOND);
        -> '1993-01-01 00:00:01.000001'

DATE_FORMAT(date, format):

MySQL функция DATE_FORMAT() форматирует значение даты в соответствии со строкой формата. Если любой из аргументов имеет значение NULL, то функция возвращает значение NULL.

Спецификаторы, указанные ниже, могут использоваться в строке аргумента format. Символ % требуется перед символами спецификатора формата. Спецификаторы применимы и к другим функциям: STR_TO_DATE(), TIME_FORMAT(), UNIX_TIMESTAMP().

Спецификаторы используемые в строке формата:

  • %a - Сокращенное название дня недели (Sun..Sat)
  • %b - Сокращенное название месяца (Jan..Dec)
  • %c - Месяц, число (0..12)
  • %D - День месяца с английским суффиксом (0th, 1st, 2nd, 3rd, …)
  • %d - День месяца, число (00..31)
  • %e - День месяца, число (0..31)
  • %f - Микросекунда (000000..999999)
  • %H - Час (00..23)
  • %h - Час (01..12)
  • %I - Час (01..12)
  • %i - Минуты, число (00..59)
  • %j - День года (001..366)
  • %k - Час (0..23)
  • %l - Час (1..12)
  • %M - Название месяца (January..December)
  • %m - Месяц, число (00..12)
  • %p - AM или PM
  • %r - Время, 12 часовой формат (hh:mm:ss с последующим AM или PM)
  • %S - Секунды (00..59)
  • %s - Секунды (00..59)
  • %T - Время, 24 часовой формат (hh:mm:ss)
  • %U - Неделя (00..53), где воскресенье - первый день недели; в функции WEEK() режим mode=0
  • %u - Неделя (00..53), где понедельник - первый день недели; в функции WEEK() режим mode=1
  • %V - Неделя (01..53), где воскресенье - первый день недели; в функции WEEK() режим mode=2; используется с %X
  • %v - Неделя (01..53), где понедельник - первый день недели; в функции WEEK() режим mode=3; используется с %x
  • %W - Название дня недели (Sunday..Saturday)
  • %w - День недели (0=Sunday..6=Saturday)
  • %X - Год недели, где воскресенье - первый день недели, четырехзначное число; используется с %V
  • %x - Год недели, где понедельник - первый день недели, четырехзначное число; используется с %v
  • %Y - Год, число из четырех цифр
  • %y - Год, число из двух цифр
  • %% - Буквальный символ %

Диапазоны для спецификаторов месяца и дня начинаются с нуля из-за того, что MySQL позволяет хранить неполные даты, такие как '2014-00-00'.

Язык, используемый для названий дней и месяцев и сокращений, управляется значением системной переменной lc_time_names. Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names может быть установлена в значение 'ru_RU'. Набор локалей, поддерживаемых MySQL, может отличаться от поддерживаемых операционной системой.

Спецификаторы %U, %u, %V и %v в описании функции WEEK() для получения информации о значениях режима. Режим влияет на то, как происходит нумерация недель.

Функция DATE_FORMAT() возвращает строку с набором символов и параметрами сортировки, заданными с помощью character_set_connection и collation_connection, чтобы она могла возвращать названия месяцев и дней недели, содержащие символы, отличные от ASCII.

mysql> SET @@lc_time_names='ru_RU';
mysql> SELECT @@lc_time_names;
        -> 'ru_RU'
mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
        -> 'Воскресенье Октября 2009'
mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
    ->                 '%D %y %a %d %m %b %j');
        -> '4th 00 Чтв 04 10 Окт 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
    ->                 '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
        -> '1998 52'
mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
        -> '00'

DAYNAME(date):

MySQL функция DAYNAME() возвращает название дня недели для date. Язык, используемый для дня недели, управляется значением системной переменной lc_time_names. Возвращает NULL, если дата равна NULL.

Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names может быть установлена в значение 'ru_RU'.

mysql> SET @@lc_time_names='ru_RU';
mysql> SELECT @@lc_time_names;
        -> 'ru_RU'
mysql> SELECT DAYNAME('2007-02-03');
        -> 'Суббота'

DAYOFMONTH(date):

MySQL функция DAYOFMONTH() возвращает день месяца для даты в диапазоне от 1 до 31 или 0 для таких дат, как '0000-00-00' или 2022-00-00', которые имеют нулевую часть дня. Возвращает значение NULL, если значение date равно NULL.

mysql> SELECT DAYOFMONTH('2022-02-03');
        -> 3

DAYOFWEEK(date):

MySQL функция DAYOFWEEK() возвращает индекс дня недели для даты (1 = Sunday, 2 = Monday, …, 7 = Saturday). Эти значения индекса соответствуют стандарту ODBC. Возвращает NULL, если дата равна NULL.

mysql> SELECT DAYOFWEEK('2007-02-03');
        -> 7

DAYOFYEAR(date):

MySQL функция DAYOFYEAR() возвращает день года для даты в диапазоне от 1 до 366. Возвращает значение NULL, если значение date равно NULL.

mysql> SELECT DAYOFYEAR('2007-02-03');
        -> 34

EXTRACT(unit FROM date):

MySQL функция EXTRACT() использует те же типы спецификаторов единиц измерения unit, что и DATE_ADD() или DATE_SUB(), но извлекает части из даты, а не выполняет арифметические операции с датами. Для получения информации об аргументе unit смотрите "Встроенные БД MySQL интервалы времени". Возвращает NULL, если date равна NULL.

mysql> SELECT EXTRACT(YEAR FROM '2019-07-02');
        -> 2019
mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');
        -> 201907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03');
        -> 20102
mysql> SELECT EXTRACT(MICROSECOND
    ->                FROM '2022-01-02 10:30:00.000123');
        -> 123

FROM_DAYS(N):

MySQL функция FROM_DAYS() учитывая номер дня N, возвращает значение DATE. Возвращает значение NULL, если N равно NULL.

mysql> SELECT FROM_DAYS(730669);
        -> '2000-07-03'

Используйте FROM_DAYS() с осторожностью со старыми датами. Она не предназначен для использования со значениями, которые предшествуют появлению григорианского календаря.

FROM_UNIXTIME(unix_timestamp[,format]):

MySQL функция FROM_UNIXTIME() возвращает представление unix_timestamp в виде значения DATETIME или символьной строки. Возвращаемое значение выражается с использованием часового пояса.

Если формат format не указан, то эта функция возвращает значение DATETIME.

Если unix_timestamp или format имеет значение NULL, эта функция возвращает значение NULL.

Если unix_timestamp является целым числом, то точность DATETIME в долях секунды равна нулю. Когда unix_timestamp является десятичным значением, то точность DATETIME в долях секунды совпадает с точностью десятичного значения. Когда unix_timestamp является числом с плавающей запятой, то точность даты и времени в долях секунды равна 6.

На 32-разрядных платформах максимальное полезное значение для unix_timestamp - 2147483647,999999, что возвращает '2038-01-19 03:14:07.999999' UTC. На 64-битных платформах, работающих под управлением MySQL 8.0.28 или более поздней версии, эффективный максимум равен 32536771199,999999, что возвращает '3001-01-18 23:59:59.999999' UTC. Независимо от платформы или версии большее значение unix_timestamp, чем действующий максимум, возвращает 0.

Аргумент формата format используется для форматирования результата так же, как строка формата, используемая для функции DATE_FORMAT(). Если указан формат, то возвращаемое значение является VARCHAR.

mysql> SELECT FROM_UNIXTIME(1447430881);
        -> '2015-11-13 10:08:01'
mysql> SELECT FROM_UNIXTIME(1447430881) + 0;
        -> 20151113100801
mysql> SELECT FROM_UNIXTIME(1447430881,
    ->                      '%Y %D %M %h:%i:%s %x');
        -> '2015 13th November 10:08:01 2015'

Примечание. Если используется UNIX_TIMESTAMP() и FROM_UNIXTIME() для преобразования между значениями в часовом поясе, отличном от UTC, и значениями временной метки Unix, то преобразование будет с потерями, поскольку сопоставление не является однозначным в обоих направлениях.

GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'}):

MySQL функция GET_FORMAT() возвращает строку формата. Эта функция полезна в сочетании с функциями DATE_FORMAT() и STR_TO_DATE().

Если формат равен NULL, эта функция возвращает значение NULL.

Возможные значения для первого и второго аргументов приводят к нескольким возможным строкам формата (используемые спецификаторы смотрите в описании функции DATE_FORMAT()). Формат ISO относится к ISO 9075, а не к ISO 8601.

  • GET_FORMAT(DATE, 'USA') вернет строку формата '%m.%d.%Y'
  • GET_FORMAT(DATE, 'JIS') вернет строку формата '%Y-%m-%d'
  • GET_FORMAT(DATE, 'ISO') вернет строку формата '%Y-%m-%d'
  • GET_FORMAT(DATE, 'EUR') вернет строку формата '%d.%m.%Y'
  • GET_FORMAT(DATE, 'INTERNAL') вернет строку формата '%Y%m%d'
  • GET_FORMAT(DATETIME, 'USA') вернет строку формата '%Y-%m-%d %H.%i.%s'
  • GET_FORMAT(DATETIME, 'JIS') вернет строку формата '%Y-%m-%d %H:%i:%s'
  • GET_FORMAT(DATETIME, 'ISO') вернет строку формата '%Y-%m-%d %H:%i:%s'
  • GET_FORMAT(DATETIME, 'EUR') вернет строку формата '%Y-%m-%d %H.%i.%s'
  • GET_FORMAT(DATETIME, 'INTERNAL') вернет строку формата '%Y%m%d%H%i%s'
  • GET_FORMAT(TIME, 'USA') вернет строку формата '%h:%i:%s %p'
  • GET_FORMAT(TIME, 'JIS') вернет строку формата '%H:%i:%s'
  • GET_FORMAT(TIME, 'ISO') вернет строку формата '%H:%i:%s'
  • GET_FORMAT(TIME, 'EUR') вернет строку формата '%H.%i.%s'
  • GET_FORMAT(TIME, 'INTERNAL') вернет строку формата '%H%i%s'

В качестве первого аргумента для GET_FORMAT() также может использоваться тип TIMESTAMP, и в этом случае функция возвращает те же значения, что и для DATETIME.

Как и где использовать функцию GET_FORMAT():

mysql> SELECT DATE_FORMAT('2022-10-03',GET_FORMAT(DATE,'EUR'));
        -> '03.10.2022'
mysql> SELECT STR_TO_DATE('10.31.2022',GET_FORMAT(DATE,'USA'));
        -> '2022-10-31'

HOUR(time):

MySQL функция HOUR() возвращает час для аргумента time. Диапазон возвращаемого значения составляет от 0 до 23 для значений времени суток. Однако диапазон значений TIME на самом деле намного больше, поэтому HOUR() может возвращать значения больше 23. Возвращает NULL, если время равно NULL.

mysql> SELECT HOUR('10:05:03');
        -> 10
mysql> SELECT HOUR('272:59:59');
        -> 272

LAST_DAY(date):

MySQL функция LAST_DAY() принимает значение date, которое может быть типами DATE или DATETIME и возвращает соответствующее значение для последнего дня месяца. Возвращает значение NULL, если аргумент недействителен или равен NULL.

mysql> SELECT LAST_DAY('2022-02-05');
        -> '2022-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
        -> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
        -> '2004-01-31'
mysql> SELECT LAST_DAY('2022-03-32');
        -> NULL

MAKEDATE(year, dayofyear):

MySQL функция MAKEDATE() возвращает дату, учитывая значения года year и дня года dayofyear. Аргумент dayofyear должен быть больше 0, иначе результат будет NULL. Результат также равен NULL, если любой из аргументов равен NULL.

mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
        -> '2011-01-31', '2011-02-01'
mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
        -> '2011-12-31', '2014-12-31'
mysql> SELECT MAKEDATE(2011,0);
        -> NULL

MAKETIME(hour, minute, second):

MySQL функция MAKETIME() возвращает значение времени, вычисленное из аргументов hour, minute и second. Возвращает NULL, если любой из его аргументов равен NULL.

Второй аргумент может иметь дробную часть.

mysql> SELECT MAKETIME(12,15, 30);
        -> '12:15:30'

MICROSECOND(expr):

MySQL функция MICROSECOND() возвращает микросекунды из выражения TIME или DATETIME, которое может принимать аргумент expr в виде числа в диапазоне от 0 до 999999. Возвращает значение NULL, если expr равно NULL.

mysql> SELECT MICROSECOND('12:00:00.123456');
        -> 123456
mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010');
        -> 10

MINUTE(time):

MySQL функция MINUTE() возвращает минуту для времени time в диапазоне от 0 до 59 или NULL, если time равно NULL.

mysql> SELECT MINUTE('2022-02-03 10:05:03');
        -> 5

MONTH(date):

MySQL функция MONTH() возвращает месяц для аргумента date в диапазоне от 1 до 12 для января по декабрь или 0 для таких дат, как '0000-00-00' или '2022-00-00', которые имеют нулевую часть месяца. Возвращает значение NULL, если значение date равно NULL.

mysql> SELECT MONTH('2022-02-03');
        -> 2

MONTHNAME(date):

MySQL функция MONTHNAME() возвращает полное название месяца для даты. Язык, используемый для название месяца, определяется значением системной переменной lc_time_names. Возвращает значение NULL, если значение date равно NULL.

Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names может быть установлена в значение 'ru_RU'. Набор локалей, поддерживаемых MySQL, может отличаться от поддерживаемых операционной системой.

-- установка локали на сеанс (подключение)
mysql> SET @@lc_time_names='ru_RU';
mysql> SELECT @@lc_time_names;
        -> 'ru_RU'
mysql> SELECT MONTHNAME('2022-02-03');
        -> 'Февраля'

CURRENT_TIMESTAMP([fsp]),
NOW([fsp]):

MySQL функция NOW() (CURRENT_TIMESTAMP()) возвращает текущую дату и время в виде значения в формате 'YYYY-MM-DD hh:mm:ss' или YYYYMMDDhhmmss, в зависимости от того, используется ли функция в строковом или числовом контексте. Значение выражается в часовом поясе сеанса.

Если аргумент fsp задан (необязательный) для указания точности в долях секунды от 0 до 6, то возвращаемое значение включает в себя долю секунды из этого количества цифр.

mysql> SELECT NOW();
        -> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
        -> 20071215235026.000000

Функция NOW() возвращает постоянное время, указывающее время, в которое оператор начал выполняться. Внутри сохраненной функции или триггера функция NOW() возвращает время, в которое функция или оператор запуска начали выполняться. Это отличается от поведения функции SYSDATE(), которая возвращает точное время ее выполнения.

mysql> SELECT NOW(), SLEEP(2), NOW();
        -> 2006-04-12 13:47:36, 0, 2006-04-12 13:47:36

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
        -> 2006-04-12 13:47:44, 0, 2006-04-12 13:47:46

Кроме того, инструкция SET TIMESTAMP влияет на значение, возвращаемое функцией NOW(), но не функцией SYSDATE(). Это означает, что настройки отметки времени в двоичном журнале не влияют на вызовы SYSDATE(). Установка временной метки в ненулевое значение приводит к тому, что каждый последующий вызов NOW() возвращает это значение. Установка метки времени на ноль отменяет этот эффект, так что NOW() снова возвращает текущую дату и время.

PERIOD_ADD(P, N):

MySQL функция PERIOD_ADD() добавляет N месяцев к периоду P (в формате YYMM или YYYYMM). Возвращает значение в формате YYYYMM.

Примечание. Аргумент P не является значением даты.

Эта функция возвращает значение NULL, если P или N равно NULL.

mysql> SELECT PERIOD_ADD(200801,2);
        -> 200803

PERIOD_DIFF(P1, P2):

MySQL функция PERIOD_ADD() возвращает количество месяцев между периодами P1 и P2. Аргументы P1 и P2 должны быть в формате YYMM или YYYYMM. Обратите внимание, что аргументы периода P1 и P2 не являются значениями даты.

Эта функция возвращает значение NULL, если P1 или P2 равно NULL.

mysql> SELECT PERIOD_DIFF(200802,200703);
        -> 11

QUARTER(date):

MySQL функция QUARTER() возвращает квартал года для даты date в диапазоне от 1 до 4 или значение NULL, если значение date равно NULL.

mysql> SELECT QUARTER('2022-04-01');
        -> 2

SECOND(time):

MySQL функция SECOND() возвращает секунды для времени time в диапазоне от 0 до 59 или NULL, если время равно NULL.

mysql> SELECT SECOND('10:05:03');
        -> 3
mysql> SELECT SECOND(NOW());
        -> 15

SEC_TO_TIME(seconds):

MySQL функция SEC_TO_TIME() возвращает аргумент seconds, преобразованный в часы, минуты и секунды, в качестве значения TIME. Диапазон результата ограничен диапазоном типа данных TIME. Если аргумент находится за пределами этого диапазона то появляется предупреждение.

Функция возвращает значение NULL, если значение seconds равно NULL.

mysql> SELECT SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
        -> 3938

STR_TO_DATE(str, format):

MySQL функция STR_TO_DATE() это обратная функция DATE_FORMAT(). Она принимает строку str и строку формата format.

Функция STR_TO_DATE() возвращает значение:

  • DATETIME, если строка формата format содержит части даты и времени,
  • DATE или TIME, если строка str содержит только части даты или времени.
  • Если строка или формат имеют значение NULL, то функция возвращает значение NULL.
  • Если дата, время или значение даты и времени, извлеченное из str, является недопустимым, то STR_TO_DATE() возвращает NULL и выдает предупреждение.

Сервер сканирует аргумент str, пытаясь сопоставить ее формат. Строка формата может содержать буквенные символы и спецификаторы формата, начинающиеся с %. Буквенные символы в формате должны буквально совпадать в строке str. Спецификаторы формата в формате должны соответствовать дате или времени в строке str. Спецификаторы, которые можно использовать в формате, смотрите в описании функции DATE_FORMAT().

mysql> SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y');
        -> '2013-05-01'
mysql> SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y');
        -> '2013-05-01'

Сканирование начинается с начала строки str и завершается ошибкой, если обнаруживается несоответствие формата. Лишние символы в конце строки игнорируются.

mysql> SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s');
        -> '09:30:17'
mysql> SELECT STR_TO_DATE('a09:30:17','%h:%i:%s');
        -> NULL
mysql> SELECT STR_TO_DATE('09:30:17a','%h:%i:%s');
        -> '09:30:17'

Неуказанные части даты или времени имеют значение 0, поэтому не полностью указанные значения в str дают результат с некоторыми или всеми частями, установленными в 0:

mysql> SELECT STR_TO_DATE('abc', 'abc');
        -> '0000-00-00'
mysql> SELECT STR_TO_DATE('9', '%m');
        -> '0000-09-00'
mysql> SELECT STR_TO_DATE('9', '%s');
        -> '00:00:09'

Во время преобразования частей значений даты выполняется проверка диапазона. Это означает, например, что разрешены "нулевые" даты или даты со значениями частей, равными 0, если только режим SQL не настроен на запрет таких значений.

mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
        -> '0000-00-00'
mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
        -> '2004-04-31'

Если включен SQL-режим NO_ZERO_DATE, то нулевые даты запрещены. В этом случае STR_TO_DATE() возвращает NULL и генерирует предупреждение:

mysql> SET sql_mode = '';
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
        -> '0000-00-00'
mysql> SET sql_mode = 'NO_ZERO_DATE';
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
        -> NULL

mysql> SHOW WARNINGS
+---------+------+----------------------------------------+
| Warning | 1411 | Incorrect datetime value: '0000-00-00' |
+---------+------+----------------------------------------+

Примечание. Нельзя использовать формат '%X%V' для преобразования строки год-неделя в дату, поскольку комбинация года и недели не идентифицирует однозначно год и месяц, если неделя пересекает границу месяца. Чтобы преобразовать год-неделю в дату, также нужно указать день недели:

mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W');
        -> '2004-10-18'

SUBDATE(date, INTERVAL expr unit),
SUBDATE(expr, days):

MySQL функция SUBDATE() с использованием формы передачи аргументов INTERVAL является синонимом DATE_SUB(). Для получения информации о единицы измерения unit смотрите описание для DATE_ADD().

mysql> SELECT DATE_SUB('2022-01-02', INTERVAL 31 DAY);
        -> '2021-12-02'
mysql> SELECT SUBDATE('2022-01-02', INTERVAL 31 DAY);
        -> '2021-12-02'

Вторая форма принимаемых аргументов позволяет использовать целочисленное значение для дней. В таких случаях он интерпретируется как количество дней, которое необходимо вычесть из выражения даты или даты и времени.

mysql> SELECT SUBDATE('2022-01-02 12:00:00', 31);
        -> '2021-12-02 12:00:00'

Эта функция возвращает значение NULL, если какой-либо из ее аргументов равен NULL.

SUBTIME(expr1,expr2):

MySQL функция SUBTIME() возвращает expr1 - expr2, выраженное в виде значения в том же формате, что и expr1. Аргумент expr1 - это выражение времени или даты, а expr2 - выражение времени.

Разрешение возвращаемого типа этой функции выполняется так же, как и для функции ADDTIME();

mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002');
        -> '2007-12-30 22:58:58.999997'
mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');
        -> '-00:59:59.999999'

Эта функция возвращает значение NULL, если значение expr1 или expr2 равно NULL.

SYSDATE([fsp]):

MySQL функция SYSDATE() возвращает текущую дату и время в виде значения в формате 'YYYY-MM-DD hh:mm:ss' или YYYYMMDDhhmmss, в зависимости от того, используется ли функция в строковом или числовом контексте.

Если задан аргумент fsp для указания точности в долях секунды от 0 до 6, то возвращаемое значение включает в себя долю секунды из этого числа цифр.

Функция SYSDATE() возвращает время своего выполнения. Это отличается от поведения функции NOW(), которая возвращает постоянное время, указывающее время начала выполнения оператора. В пределах хранимой функции или триггера NOW() возвращает время начала выполнения функции или оператора триггера.

mysql> SELECT NOW(), SLEEP(2), NOW();
        -> 2006-04-12 13:47:36, 0, 2006-04-12 13:47:36

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
        -> 2006-04-12 13:47:44, 0, 2006-04-12 13:47:46

Кроме того, инструкция SET TIMESTAMP влияет на значение, возвращаемое функцией NOW(), но не функцией SYSDATE(). Это означает, что настройки отметки времени в двоичном журнале не влияют на вызовы SYSDATE().

Поскольку SYSDATE() может возвращать разные значения даже в одном операторе и на него не влияет SET TIMESTAMP, она недетерминирована и, следовательно, небезопасна для репликации, если используется двоичное ведение журнала на основе операторов. Если это проблема, то можно использовать ведение журнала на основе строк.

Кроме того, можно использовать опцию CLI --sysdate-is-now, чтобы SYSDATE() была псевдонимом для NOW(). Это работает, если параметр используется как на исходном сервере репликации, так и на реплике.

Недетерминированный характер SYSDATE() также означает, что для вычисления выражений нельзя использовать индексы, которые на него ссылаются.

TIME(expr):

MySQL функция TIME() извлекает временную часть из expr и возвращает ее в виде строки. Возвращает NULL, если expr имеет значение NULL.

Эта функция небезопасна для репликации на основе операторов. Если используется эта функция, то регистрируется предупреждение, когда для параметра binlog_format установлено значение STATEMENT.

mysql> SELECT TIME('2022-12-31 01:02:03');
        -> '01:02:03'
mysql> SELECT TIME('2022-12-31 01:02:03.000123');
        -> '01:02:03.000123'

TIMEDIFF(expr1, expr2):

MySQL функция TIMEDIFF() возвращает значение expr1 - expr2, выраженное как значение TIME. Аргументы expr1 и expr2 являются выражениями TIME или DATETIME, но оба должны быть одного типа. Возвращает значение NULL, если значение expr1 или expr2 равно NULL.

Результат, возвращаемый TIMEDIFF(), ограничен диапазоном, разрешенным для значений TIME. В качестве альтернативы можно использовать любую из функций TIMESTAMPDIFF() и UNIX_TIMESTAMP(), обе из которых возвращают целые числа.

mysql> SELECT TIMEDIFF('2000-01-01 00:00:00',
    ->                 '2000-01-01 00:00:00.000001');
        -> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('2022-12-31 23:59:59.000001',
    ->                 '2022-12-30 01:01:01.000002');
        -> '46:58:57.999999'

TIMESTAMP(expr),
TIMESTAMP(expr1,expr2):

MySQL функция TIMESTAMP() с одним аргументом возвращает выражение DATE или TIME аргумента expr в качестве значения DATETIME.

Функция TIMESTAMP() с двумя аргументами добавляет выражение времени expr2 к выражению DATE или TIME аргумента expr1 и возвращает результат в виде значения DATETIME. Возвращает значение NULL, если значение expr, expr1 или expr2 равно NULL.

mysql> SELECT TIMESTAMP('2022-12-31');
        -> '2022-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2022-12-31 12:00:00', '12:00:00');
        -> '2004-01-01 00:00:00'

TIMESTAMPADD(unit, interval, datetime_expr):

MySQL функция TIMESTAMPADD() добавляет interval целочисленного выражения к выражению datetime_expr даты или даты и времени. Единица измерения интервала задается аргументом unit, который может принимать одно из следующих значений: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER или YEAR.

Эта функция возвращает NULL, если interval или datetime_expr имеет значение NULL.

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2022-01-02');
        -> '2022-01-02 00:01:00'
mysql> SELECT TIMESTAMPADD(WEEK,1,'2022-01-02');
        -> '2022-01-09'

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2):

MySQL функция TIMESTAMPDIFF() возвращает datetime_expr2 - datetime_expr1, где datetime_expr1 и datetime_expr2 являются выражениями DATE или DATETIME. Одним выражением может быть DATE, а другим - DATETIME. Значение DATE обрабатывается как DATETIME, имеющее временную часть '00:00:00', где это необходимо. Единица измерения для результата (целое число) задается аргументом unit. Допустимые значения для единицы измерения совпадают с теми, которые перечислены в описании функции TIMESTAMPADD().

Эта функция возвращает значение NULL, если значение datetime_expr1 или datetime_expr2 равно NULL

mysql> SELECT TIMESTAMPDIFF(MONTH,'2022-02-01','2022-05-01');
        -> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
        -> -1
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2022-02-01','2022-05-01 12:05:55');
        -> 128885

Примечание. Порядок аргументов даты или даты и времени для этой функции противоположен порядку, используемому с функцией TIMESTAMP() при вызове с двумя аргументами.

TIME_FORMAT(time, format):

MySQL функция TIME_FORMAT() используется аналогично функции DATE_FORMAT(), но строка формата может содержать спецификаторы формата только для часов, минут, секунд и микросекунд. Другие спецификаторы выдают NULL или 0.

TIME_FORMAT() возвращает NULL, если время или формат равны NULL.

Если значение time содержит часовую часть, превышающую 23, то спецификаторы формата часа %H и %k выдают значение, превышающее обычный диапазон от 0 до 23. Другие спецификаторы формата часа производят значение часа по модулю 12.

mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
        -> '100 100 04 04 4'

TIME_TO_SEC(time):

MySQL функция TIME_TO_SEC() возвращает аргумент time, преобразованный в секунды. Возвращает NULL, если time равно NULL.

mysql> SELECT TIME_TO_SEC('22:23:00');
        -> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
        -> 2378

TO_DAYS(date):

MySQL функция TO_DAYS() учитывая дату date, возвращает номер дня (количество дней, прошедших с 0 года). Возвращает значение NULL, если значение date равно NULL.

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('2007-10-07');
        -> 733321

Функция TO_DAYS() не предназначена для использования со значениями, предшествующими появлению григорианского календаря (1582 г.), так как не учитывает дни, потерянные при изменении календаря. Для дат до 1582 года (и, возможно, более позднего года в других регионах) результаты этой функции ненадежны.

Помните, что MySQL преобразует двузначные значения года в даты в четырехзначную форму, используя правила, например, '2022-10-07' и '22-10-07' считаются идентичными датами:

mysql> SELECT TO_DAYS('2022-10-07'), TO_DAYS('22-10-07');
        -> 738800, 738800

В MySQL нулевая дата определяется как '0000-00-00', хотя сама эта дата считается недействительной. Это означает, что для '0000-00-00' и '0000-01-01' функция TO_DAYS() возвращает значения, показанные здесь:

mysql> SELECT TO_DAYS('0000-00-00');
        -> NULL

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '0000-00-00' |
+---------+------+----------------------------------------+

mysql> SELECT TO_DAYS('0000-01-01');
        -> 1

Это верно независимо от того, включен или нет режим ALLOW_INVALID_DATES.

TO_SECONDS(expr):

MySQL функция TO_SECONDS() при заданном expr, принимающим DATE или DATETIME возвращает количество секунд, прошедших с 0 года. Если выражение не является допустимым значением DATE или DATETIME (включая NULL), возвращается NULL.

mysql> SELECT TO_SECONDS(950501);
        -> 62966505600
mysql> SELECT TO_SECONDS('2009-11-29');
        -> 63426672000
mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');
        -> 63426721412
mysql> SELECT TO_SECONDS( NOW() );
        -> 63823909592

Как и TO_DAYS(), функция TO_SECONDS() не предназначена для использования со значениями, которые предшествуют появлению григорианского календаря (1582 г.), поскольку она не учитывает дни, которые были потеряны при изменении календаря. Для дат до 1582 года (и, возможно, более позднего года в других регионах) результаты этой функции ненадежны.

Как и TO_DAYS(), функция TO_SECONDS() преобразует двузначные значения года в датах в четырехзначную форму с использованием правил.

В MySQL нулевая дата определяется как '0000-00-00', хотя сама эта дата считается недействительной. Это означает, что для '0000-00-00' и '0000-01-01' функция TO_SECONDS() возвращает значения, показанные здесь:

mysql> SELECT TO_SECONDS('0000-00-00');
        -> NULL

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '0000-00-00' |
+---------+------+----------------------------------------+

mysql> SELECT TO_SECONDS('0000-01-01');
        -> 86400

Это верно независимо от того, включен или нет режим ALLOW_INVALID_DATES.

UNIX_TIMESTAMP([date]):

Если MySQL функция UNIX_TIMESTAMP() вызывается без аргумента date, то она возвращает временную метку Unix, представляющую секунды с момента '1970-01-01 00:00:00' UTC.

Если UNIX_TIMESTAMP() вызывается с аргументом date, то она возвращает значение аргумента в секундах с момента '1970-01-01 00:00:00' UTC. Сервер интерпретирует дату как значение в часовом поясе сеанса и преобразует его во внутреннее значение метки времени Unix в UTC. Аргументом date может быть строка DATE, DATETIME, или TIMESTAMP или число в формате YYMMDD, YYMMDDhhmmss, YYYYMMDD или YYYYMMDDhhmmss. Если аргумент включает в себя временную часть, то он может необязательно включать в себя долю секунды.

Возвращаемое значение является целым числом, если аргумент не указан или аргумент не включает доли секунд, или DECIMAL, если указан аргумент, включающий доли секунд.

Когда аргументом date является столбец TIMESTAMP, то UNIX_TIMESTAMP() возвращает значение внутренней временной метки напрямую, без неявного преобразования строки в временную метку Unix.

До версии MySQL 8.0.28 допустимый диапазон значений аргументов такой же, как и для типа данных TIMESTAMP: от '1970-01-01 00:00:01.000000' UTC до '2038-01-19 03:14:07.999999' UTC. Это также имеет место в MySQL 8.0.28 и более поздних версиях для 32-разрядных платформ. Для MySQL 8.0.28 и более поздних версий, работающих на 64-разрядных платформах, допустимый диапазон значений аргументов для UNIX_TIMESTAMP() - от '1970-01-01 00:00:01.000000' UTC до '3001-01-19 03:14:07.999999' UTC (соответствует 32536771199,999999 секунд).

Независимо от версии MySQL или архитектуры платформы, если передать UNIX_TIMESTAMP() дату вне допустимого диапазона, она возвращает 0. Если дата равна NULL, она возвращает NULL.

mysql> SELECT UNIX_TIMESTAMP();
        -> 1447431666
mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');
        -> 1447431619
mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');
        -> 1447431619.012

Если использовать UNIX_TIMESTAMP() и FROM_UNIXTIME() для преобразования между значениями в часовом поясе, отличном от UTC, и значениями временной метки Unix, то преобразование будет с потерями, поскольку сопоставление не является однозначным в обоих направлениях. Например, из-за соглашений об изменении местного часового пояса, таких как переход на летнее время (DST), UNIX_TIMESTAMP() может сопоставить два значения, которые отличаются в часовом поясе, отличном от UTC, с одним и тем же значением метки времени Unix. Функция FROM_UNIXTIME() сопоставляет это значение только с одним из исходных значений. Вот пример, в котором используются значения, отличающиеся в часовом поясе MET:

mysql> SET time_zone = 'MET';
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
        -> 1111885200
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
        -> 1111885200

mysql> SELECT FROM_UNIXTIME(1111885200);
        -> 2005-03-27 03:00:00

Примечание. Чтобы использовать именованные часовые пояса, такие как 'MET' или 'Europe/Moscow', необходимо правильно настроить таблицы часовых поясов.

UTC_DATE():

MySQL функция UTC_DATE() возвращает текущую дату в формате UTC в виде значения в формате 'YYYY-MM-DD' или YYYYMMDD, в зависимости от того, используется ли функция в строковом или числовом контексте.

mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
        -> '2022-08-14', 20030814

UTC_TIME([fsp]):

MySQL функция UTC_TIME() возвращает текущее время UTC в виде значения в формате 'hh:mm:ss' или hhmmss, в зависимости от того, используется ли функция в строковом или числовом контексте.

Если аргумент fsp задан для указания точности в дробных секундах от 0 до 6, то возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.

mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
        -> '18:07:53', 180753.000000

UTC_TIMESTAMP([fsp]):

Свойство UTC_TIMESTAMP возвращает текущую дату и время UTC в виде значения в формате 'YYYY-MM-DD hh:mm:ss' или YYYYMMDDhhmmss, в зависимости от того, используется ли функция в строковом или числовом контексте.

Если аргумент fsp задан для указания точности в дробных секундах от 0 до 6, возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.

mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
        -> '2022-08-14 18:08:04', 20030814180804.000000

WEEK(date[, mode]):

MySQL функция WEEK() возвращает номер недели для даты date. Форма WEEK() с двумя аргументами позволяет указать, начинается ли неделя в воскресенье или понедельника и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент mode опущен, то используется значение системной переменной default_week_format. Для значения даты NULL функция возвращает значение NULL.

В следующей таблице описано, как работает аргумент mode.

modeПервый день неделиДиапазонЧто считать первой неделей?
0Воскресенье0-531 неделю с 4 или более дней в этом году
1Понедельник0-531 неделю с 4 или более дней в этом году
2Воскресенье1-531 неделю с воскресеньем в этом году
3Понедельник1-531 неделю с 4 или более дней в этом году
4Воскресенье0-531 неделю с 4 или более дней в этом году
5Понедельник0-531 неделю с понедельником в этом году
6Воскресенье1-531 неделю с 4 или более дней в этом году
7Понедельник1-531 неделю с понедельником в этом году

Для значений mode с 4 или более днями в этом году недели нумеруются в соответствии со стандартом ISO 8601:1988:

Если неделя, содержащая 1 января, имеет 4 или более дней в новом году, то это неделя 1.

В противном случае это последняя неделя предыдущего года, а следующая неделя - будет 1 неделя этого года.

mysql> SELECT WEEK('2022-02-20');
        -> 8
mysql> SELECT WEEK('2022-02-20',0);
        -> 8
mysql> SELECT WEEK('2022-02-20',1);
        -> 7
mysql> SELECT WEEK('2022-12-31',1);
        -> 52

Если дата приходится на последнюю неделю предыдущего года, то MySQL возвращает 0, если не использовать 2, 3, 6 или 7 в качестве необязательного аргумента mode:

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
        -> 2000, 0

Можно возразить, что WEEK() должна возвращать 52, потому что данная дата фактически приходится на 52-ю неделю 1999 года. Вместо этого WEEK() возвращает 0, так что возвращаемое значение - это "номер недели в данном году". Это делает использование функции WEEK() надежным в сочетании с другими функциями, извлекающими часть даты из даты.

Если предпочитаете, чтобы результат вычислялся относительно года, содержащего первый день недели для данной даты, то используйте 0, 2, 5 или 7 в качестве необязательного аргумента mode.

mysql> SELECT WEEK('2000-01-01',2);
        -> 52

В качестве альтернативы используйте функцию YEARWEEK():

mysql> SELECT YEARWEEK('2000-01-01');
        -> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
        -> '52'

WEEKDAY(date):

MySQL функция WEEKDAY() возвращает индекс дня недели для даты date (0 = Monday, 1 = Tuesday, … 6 = Sunday). Возвращает значение NULL, если значение date равно NULL.

mysql> SELECT WEEKDAY('2022-02-03 22:23:00');
        -> 2
mysql> SELECT WEEKDAY('2007-11-06');
        -> 1

WEEKOFYEAR(date):

MySQL функция WEEKOFYEAR() возвращает календарную неделю даты date в виде числа в диапазоне от 1 до 53. Возвращает NULL, если date имеет значение NULL.

Функция WEEKOFYEAR(date) эквивалентна WEEK(date, 3).

mysql> SELECT WEEKOFYEAR('2022-02-20');
        -> 7

YEAR(date):

MySQL функция YEAR() возвращает год для переданной date в диапазоне от 1000 до 9999 или 0 для "нулевой" date. Возвращает NULL, если date равна NULL.

mysql> SELECT YEAR('1987-01-01');
        -> 1987

YEARWEEK(date),
YEARWEEK(date, mode):

MySQL функция YEARWEEK() возвращает год и неделю для аргумента даты date. Год в результате может отличаться от года в аргументе date для первой и последней недели года. Возвращает NULL, если дата равна NULL.

Аргумент mode работает точно так же, как аргумент mode в WEEK(). Для синтаксиса с одним аргументом, используется mode=0. В отличие от WEEK(), значение default_week_format не влияет на YEARWEEK().

mysql> SELECT YEARWEEK('1987-01-01');
        -> 198652

Номер недели отличается от того, что функция WEEK() вернула бы для необязательных аргументов 0 или 1, поскольку WEEK() затем возвращает неделю в контексте данного года.