Spec-Zone.ru › MySQL 5.7

12.7 Функции даты и времени

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

Таблица 12.11 Функции даты и времени

Таблица 12.11 Функции даты и времени
Имя Описание
ADDDATE() Добавление временных значений (интервалов) к значению даты
ADDTIME() Добавление времени
CONVERT_TZ() Преобразование из одной временной зоны в другую
CURDATE() Возвращение текущей даты
CURRENT_DATE(), CURRENT_DATE Синонимы для CURDATE()
CURRENT_TIME(), CURRENT_TIME Синонимы для CURTIME()
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP Синонимы для NOW()
CURTIME() Возвращение текущего времени
DATE() Извлечение части даты из выражения даты или даты и времени
DATE_ADD() Добавление временных значений (интервалов) к значению даты
DATE_FORMAT() Форматирование даты в соответствии со спецификацией
DATE_SUB() Вычитание временного значения (интервала) из даты
DATEDIFF() Вычитание двух дат
DAY() Синоним для DAYOFMONTH()
DAYNAME() Возвращение названия дня недели
DAYOFMONTH() Возвращение дня месяца (0-31)
DAYOFWEEK() Возвращение индекса дня недели для аргумента
DAYOFYEAR() Возвращение дня года (1-366)
EXTRACT() Извлечение части даты
FROM_DAYS() Преобразование номера дня в дату
FROM_UNIXTIME() Форматирование Unix-временной метки как даты
GET_FORMAT() Возвращение строки формата даты
HOUR() Извлечение часа
LAST_DAY Возвращение последнего дня месяца для аргумента
LOCALTIME(), LOCALTIME Синоним для NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP() Синоним для NOW()
MAKEDATE() Создание даты из года и дня года
MAKETIME() Создание времени из часа, минуты, секунды
MICROSECOND() Возвращение микросекунд из аргумента
MINUTE() Возвращение минуты из аргумента
MONTH() Возвращение месяца из переданной даты
MONTHNAME() Возвращение названия месяца
NOW() Возвращение текущей даты и времени
PERIOD_ADD() Добавление периода к году-месяцу
PERIOD_DIFF() Возвращение количества месяцев между периодами
QUARTER() Возвращение квартала из аргумента даты
SEC_TO_TIME() Преобразование секунд в формат 'чч:мм:сс'
SECOND() Возвращение секунды (0-59)
STR_TO_DATE() Преобразование строки в дату
SUBDATE() Синоним для DATE_SUB() при вызове с тремя аргументами
SUBTIME() Вычитание временных значений
SYSDATE() Возвращение времени, в которое выполняется функция
TIME() Извлечение временной части переданного выражения
TIME_FORMAT() Форматирование как время
TIME_TO_SEC() Возвращение аргумента, преобразованного в секунды
TIMEDIFF() Вычитание времени
TIMESTAMP() С одним аргументом эта функция возвращает выражение даты или даты и времени; с двумя аргументами — сумму аргументов
TIMESTAMPADD() Добавление интервала к выражению даты и времени
TIMESTAMPDIFF() Возвращает разницу между двумя выражениями даты и времени, используя указанные единицы
TO_DAYS() Возвращение аргумента даты, преобразованного в дни
TO_SECONDS() Возвращение аргумента даты или даты и времени, преобразованного в секунды с года 0
UNIX_TIMESTAMP() Возвращение Unix-временной метки
UTC_DATE() Возвращение текущей даты UTC
UTC_TIME() Возвращение текущего времени UTC
UTC_TIMESTAMP() Возвращение текущей даты и времени UTC
WEEK() Возвращение номера недели
WEEKDAY() Возвращение индекса дня недели
WEEKOFYEAR() Возвращение календарной недели даты (1-53)
YEAR() Возвращение года
YEARWEEK() Возвращение года и недели

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

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

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

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

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

Функции CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE() и FROM_UNIXTIME() возвращают значения в часовом поясе текущей сессии, который доступен как значение сессии переменной системы time_zone. Кроме того, UNIX_TIMESTAMP() предполагает, что ее аргумент представляет собой значение даты и времени в часовом поясе текущей сессии. См. Раздел 5.1.13, «Поддержка часовых поясов в MySQL Server».

Некоторые функции даты могут использоваться с датами «ноль» или неполными датами, такими как '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

Несколько функций строго проверяют, если значение функции DATE() передается в качестве аргумента, и отклоняют неполные даты с нулевой частью дня: CONVERT_TZ(), DATE_ADD(), DATE_SUB(), DAYOFYEAR(), TIMESTAMPDIFF(), TO_DAYS(), TO_SECONDS(), WEEK(), WEEKDAY(), WEEKOFYEAR(), YEARWEEK().

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

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

    При вызове с формой второго аргумента INTERVAL, ADDDATE() является синонимом для DATE_ADD(). Соответствующая функция SUBDATE() является синонимом для DATE_SUB(). Сведения о INTERVAL аргументе unit см. в Временные интервалы.

    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'
    

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

    mysql> SELECT ADDDATE('2008-01-02', 31);
            -> '2008-02-02'
    
  • ADDTIME(expr1,expr2)

    ADDTIME() добавляет expr2 к expr1 и возвращает результат. expr1 — выражение времени или даты и времени, а expr2 — выражение времени.

    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'
    
  • CONVERT_TZ(dt,from_tz,to_tz)

    CONVERT_TZ() преобразует значение даты и времени dt из часового пояса, заданного from_tz, в часовой пояс, заданный to_tz, и возвращает полученное значение. Часовые пояса задаются, как описано в Разделе 5.1.13, «Поддержка часовых поясов MySQL-сервера». Если аргументы неверны, функция возвращает NULL.

    Если значение выходит за поддерживаемый диапазон типа TIMESTAMP при преобразовании из from_tz в UTC, преобразование не выполняется. Диапазон TIMESTAMP описан в Разделе 11.2.1, «Синтаксис типов данных даты и времени».

    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
            -> '2004-01-01 13:00:00'
    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
            -> '2004-01-01 22:00:00'
    
    Примечание

    Для использования именованных часовых поясов, таких как 'MET' или 'Europe/Amsterdam', таблицы часовых поясов должны быть должным образом настроены. Инструкции см. в Разделе 5.1.13, «Поддержка часовых поясов MySQL-сервера».

  • CURDATE()

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

    mysql> SELECT CURDATE();
            -> '2008-06-13'
    mysql> SELECT CURDATE() + 0;
            -> 20080613
    
  • CURRENT_DATE, CURRENT_DATE()

    CURRENT_DATE и CURRENT_DATE() являются синонимами для CURDATE().

  • CURRENT_TIME, CURRENT_TIME([fsp])

    CURRENT_TIME и CURRENT_TIME() являются синонимами для CURTIME().

  • CURRENT_TIMESTAMP, CURRENT_TIMESTAMP([fsp])

    CURRENT_TIMESTAMP и CURRENT_TIMESTAMP() являются синонимами для NOW().

  • CURTIME([fsp])

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

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

    mysql> SELECT CURTIME();
            -> '23:50:26'
    mysql> SELECT CURTIME() + 0;
            -> 235026.000000
    
  • DATE(expr)

    Извлекает часть даты из выражения даты или даты и времени expr.

    mysql> SELECT DATE('2003-12-31 01:02:03');
            -> '2003-12-31'
    
  • DATEDIFF(expr1,expr2)

    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
    
  • DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

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

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

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

    • DATE, если аргумент date — значение DATE и ваши вычисления включают только YEAR, MONTH и DAY части (то есть, без частей времени).

    • DATETIME, если первый аргумент — значение DATETIME (или TIMESTAMP), или если первый аргумент — DATE и значение unit использует HOURS, MINUTES или SECONDS.

    • Строка в противном случае.

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

    mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
            -> '2018-05-02'
    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'
    

    При добавлении MONTH интервала к значению DATE или DATETIME, и полученная дата включает день, который не существует в заданном месяце, день корректируется до последнего дня месяца, как показано здесь:

    mysql> SELECT DATE_ADD('2024-03-30', INTERVAL 1 MONTH) AS d1,
         >        DATE_ADD('2024-03-31', INTERVAL 1 MONTH) AS d2;
    +------------+------------+
    | d1         | d2         |
    +------------+------------+
    | 2024-04-30 | 2024-04-30 |
    +------------+------------+
    1 row in set (0.00 sec)
    
  • DATE_FORMAT(date,format)

    Форматирует значение date в соответствии со строкой format.

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

    Specifier Описание
    %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), где воскресенье — первый день недели; режим 0 функции WEEK()
    %u Неделя (00..53), где понедельник — первый день недели; режим 1 функции WEEK()
    %V Неделя (01..53), где воскресенье — первый день недели; режим 2 функции WEEK(); используется с %X
    %v Неделя (01..53), где понедельник — первый день недели; режим 3 функции WEEK(); используется с %x
    %W Полное название дня недели (Sunday..Saturday)
    %w Номер дня недели (0=воскресенье..6=суббота)
    %X Год для недели, где воскресенье — первый день, числовой, четыре цифры; используется с %V
    %x Год для недели, где понедельник — первый день, числовой, четыре цифры; используется с %v
    %Y Год, числовой, четыре цифры
    %y Год, числовой (две цифры)
    %% Буквальный символ %
    %x x, для любого “x” не указанного выше

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

    Язык, используемый для названий и сокращений дней и месяцев, определяется значением системной переменной lc_time_names (Раздел 10.16, «Поддержка локалей сервера MySQL»).

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

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

    mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
            -> 'Sunday October 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 Thu 04 10 Oct 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'
    
  • DATE_SUB(date,INTERVAL expr unit)

    См. описание DATE_ADD().

  • DAY(date)

    DAY() является синонимом для DAYOFMONTH().

  • DAYNAME(date)

    Возвращает имя дня недели для date. Используемый язык определяется значением системной переменной lc_time_names (Раздел 10.16, «Поддержка локалей сервера MySQL»).

    mysql> SELECT DAYNAME('2007-02-03');
            -> 'Saturday'
    
  • DAYOFMONTH(date)

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

    mysql> SELECT DAYOFMONTH('2007-02-03');
            -> 3
    
  • DAYOFWEEK(date)

    Возвращает индекс дня недели для date (1 = воскресенье, 2 = понедельник, …, 7 = суббота). Эти значения индекса соответствуют стандарту ODBC.

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

    Возвращает номер дня года для date в диапазоне от 1 до 366.

    mysql> SELECT DAYOFYEAR('2007-02-03');
            -> 34
    
  • EXTRACT(unit FROM date)

    Функция EXTRACT() использует те же типы спецификаторов unit, что и DATE_ADD() или DATE_SUB(), но извлекает части даты вместо выполнения арифметических операций с датами. Для информации об аргументе unit см. Временные интервалы.

    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 '2003-01-02 10:30:00.000123');
            -> 123
    
  • FROM_DAYS(N)

    При заданном номере дня N возвращает значение типа DATE.

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

    Используйте FROM_DAYS() с осторожностью для старых дат. Она не предназначена для использования со значениями, предшествующими появлению григорианского календаря (1582). См. Раздел 11.2.8, «Какой календарь используется MySQL?».

END_OF_DOCUMENT_MARKER
  • FROM_UNIXTIME(unix_timestamp[,format])

    Возвращает представление unix_timestamp в виде значения даты и времени или строкового значения. Возвращаемое значение выражается с использованием часового пояса сессии. (Клиенты могут установить часовой пояс сессии, как описано в разделе 5.1.13, «Поддержка часовых поясов сервера MySQL».) unix_timestamp — это внутреннее значение метки времени, представляющее секунды с момента '1970-01-01 00:00:00' UTC, например, полученные функцией UNIX_TIMESTAMP().

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

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

    format используется для форматирования результата так же, как строка формата, используемая для функции DATE_FORMAT(). Если 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-времени, преобразование является потерей информации, так как отображение не является взаимно однозначным в обоих направлениях. Подробности см. в описании функции UNIX_TIMESTAMP().

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

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

    Возможные значения для первого и второго аргументов приводят к нескольким возможным строкам формата (для используемых спецификаторов см. таблицу в описании функции 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'

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

    mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
            -> '03.10.2003'
    mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
            -> '2003-10-31'
    
  • HOUR(time)

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

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

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

    mysql> SELECT LAST_DAY('2003-02-05');
            -> '2003-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('2003-03-32');
            -> NULL
    
  • LOCALTIME, LOCALTIME([fsp])

    LOCALTIME и LOCALTIME() являются синонимами для NOW().

  • LOCALTIMESTAMP, LOCALTIMESTAMP([fsp])

    LOCALTIMESTAMP и LOCALTIMESTAMP() являются синонимами для NOW().

  • MAKEDATE(year,dayofyear)

    Возвращает дату, заданную значениями года и дня года. dayofyear должно быть больше 0, иначе результатом будет 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)

    Возвращает значение времени, вычисленное из аргументов hour, minute и second.

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

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

    Возвращает микросекунды из выражения времени или даты и времени expr как число в диапазоне от 0 до 999999.

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

    Возвращает минуты для time в диапазоне от 0 до 59.

    mysql> SELECT MINUTE('2008-02-03 10:05:03');
            -> 5
    
  • MONTH(date)

    Возвращает месяц для date в диапазоне от 1 до 12 для января-декабря или 0 для дат, таких как '0000-00-00' или '2008-00-00', у которых есть нулевая часть месяца.

    mysql> SELECT MONTH('2008-02-03');
            -> 2
    
  • MONTHNAME(date)

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

    mysql> SELECT MONTHNAME('2008-02-03');
            -> 'February'
    
  • Функция NOW

    Возвращает текущую дату и время в виде значения в формате '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();
    +---------------------+----------+---------------------+
    | NOW()               | SLEEP(2) | NOW()               |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
    +---------------------+----------+---------------------+
    
    mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
    +---------------------+----------+---------------------+
    | SYSDATE()           | SLEEP(2) | SYSDATE()           |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
    +---------------------+----------+---------------------+
    

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

    Дополнительную информацию о различиях между двумя функциями см. в описании функции SYSDATE.

  • Функция PERIOD_ADD

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

    Примечание

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

    mysql> SELECT PERIOD_ADD(200801,2);
            -> 200803
    
  • Функция PERIOD_DIFF

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

    mysql> SELECT PERIOD_DIFF(200802,200703);
            -> 11
    
  • Функция QUARTER

    Возвращает квартал года для date в диапазоне от 1 до 4.

    mysql> SELECT QUARTER('2008-04-01');
            -> 2
    
  • Функция SECOND

    Возвращает секунды для time в диапазоне от 0 до 59.

    mysql> SELECT SECOND('10:05:03');
            -> 3
    
  • Функция SEC_TO_TIME

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

    mysql> SELECT SEC_TO_TIME(2378);
            -> '00:39:38'
    mysql> SELECT SEC_TO_TIME(2378) + 0;
            -> 3938
    
  • Функция STR_TO_DATE

    Это обратная функция DATE_FORMAT. Она принимает строку str и строку формата format. Функция STR_TO_DATE возвращает значение DATETIME, если строка формата содержит части даты и времени, или значение DATE или TIME, если строка содержит только части даты или времени. Если str или format равны NULL, функция возвращает NULL. Если значение даты, времени или datetime, извлеченное из str, не может быть проанализировано в соответствии с правилами сервера, STR_TO_DATE возвращает NULL и генерирует предупреждение.

    Сервер сканирует str, пытаясь сопоставить format с ним. Строка формата может содержать литерные символы и спецификаторы формата, начинающиеся с %. Литерные символы в format должны точно соответствовать str. Спецификаторы формата в format должны соответствовать части даты или времени в str. Для спецификаторов, которые можно использовать в format, см. описание функции 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 и завершается неудачей, если format не совпадает. Дополнительные символы в конце 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'
    

    Проверка диапазона частей значений дат описана в разделе 11.2.2, «Типы данных DATE, DATETIME и TIMESTAMP». Это означает, например, что год проверяется на попадание в диапазон 0-9999 включительно, месяц проверяется на попадание в диапазон 1-12 включительно, а день месяца проверяется на попадание в диапазон 1-31 включительно, но сервер не проверяет значения в сочетании. Например, SELECT STR_TO_DATE('23-2-31', '%Y-%m-%d') возвращает 2023-02-31. Включение или выключение серверного SQL-режима sqlmode_allow_invalid_dates не влияет на это поведение. См. раздел 11.2.2, «Типы данных DATE, DATETIME и TIMESTAMP» для получения дополнительной информации.

    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-режим sqlmode_no_zero_date, нулевые даты запрещены. В этом случае STR_TO_DATE возвращает NULL и генерирует предупреждение:

    mysql> SET sql_mode = '';
    mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
    +---------------------------------------+
    | 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');
    +---------------------------------------+
    | STR_TO_DATE('00/00/0000', '%m/%d/%Y') |
    +---------------------------------------+
    | NULL                                  |
    +---------------------------------------+
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 1411
    Message: Incorrect datetime value: '00/00/0000' for function str_to_date
    

    До версии MySQL 5.7.44 было возможно передать строку с некорректной датой, например, '2021-11-31', в эту функцию. В MySQL 5.7.44 и более поздних версиях STR_TO_DATE() выполняет полную проверку диапазона и генерирует ошибку, если дата после преобразования окажется некорректной.

    Примечание

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

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

    Также следует учитывать, что для дат и частей дат в значениях datetime STR_TO_DATE() проверяются (только) отдельные значения года, месяца и дня месяца на валидность. Точнее, это означает, что год проверяется на попадание в диапазон от 0 до 9999 включительно, месяц проверяется на попадание в диапазон от 1 до 12 включительно, а день месяца проверяется на попадание в диапазон от 1 до 31 включительно, но сервер не проверяет значения в сочетании. Например, SELECT STR_TO_DATE('23-2-31', '%Y-%m-%d') возвращает 2023-02-31. Включение или выключение серверного SQL-режима sqlmode_allow_invalid_dates не влияет на это поведение. Дополнительная информация представлена в разделе 11.2.2, «Типы данных DATE, DATETIME и TIMESTAMP».

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

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

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

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

    mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31);
            -> '2007-12-02 12:00:00'
    
  • SUBTIME(expr1,expr2)

    SUBTIME() возвращает expr1 − expr2, выраженное как значение в том же формате, что и expr1. expr1 — это выражение времени или datetime, а expr2 — выражение времени.

    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'
    
  • SYSDATE([fsp])

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

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

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

    mysql> SELECT NOW(), SLEEP(2), NOW();
    +---------------------+----------+---------------------+
    | NOW()               | SLEEP(2) | NOW()               |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
    +---------------------+----------+---------------------+
    
    mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
    +---------------------+----------+---------------------+
    | 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, она является недетерминированной и, следовательно, небезопасной для репликации, если используется двоичный лог на основе оператора. Если это проблема, вы можете использовать журнал на основе строк.

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

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

  • TIME(expr)

    Извлекает часть времени выражения времени или datetime expr и возвращает ее как строку.

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

    mysql> SELECT TIME('2003-12-31 01:02:03');
            -> '01:02:03'
    mysql> SELECT TIME('2003-12-31 01:02:03.000123');
            -> '01:02:03.000123'
    
  • TIMEDIFF(expr1,expr2)

    TIMEDIFF() возвращает expr1 − expr2, выраженное как значение времени. expr1 и expr2 — это строки, которые преобразуются в выражения TIME или DATETIME; они должны быть одного типа после преобразования.

    Результат, возвращаемый 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('2008-12-31 23:59:59.000001',
        ->                 '2008-12-30 01:01:01.000002');
            -> '46:58:57.999999'
    
  • TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

    С одним аргументом эта функция возвращает выражение даты или datetime expr как значение datetime. С двумя аргументами она добавляет выражение времени expr2 к выражению даты или datetime expr1 и возвращает результат как значение datetime.

    mysql> SELECT TIMESTAMP('2003-12-31');
            -> '2003-12-31 00:00:00'
    mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
            -> '2004-01-01 00:00:00'
    
  • TIMESTAMPADD(unit,interval,datetime_expr)

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

    Значение unit может быть задано с помощью одного из ключевых слов, как показано, или с префиксом SQL_TSI_. Например, DAY и SQL_TSI_DAY — это допустимые значения.

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

    При добавлении интервала MONTH к значению DATE или DATETIME, и если полученная дата содержит день, который не существует в данном месяце, день корректируется до последнего дня месяца, как показано здесь:

    mysql> SELECT TIMESTAMPADD(MONTH, 1, DATE '2024-03-30') AS t1,
         >        TIMESTAMPADD(MONTH, 1, DATE '2024-03-31') AS t2;
    +------------+------------+
    | t1         | t2         |
    +------------+------------+
    | 2024-04-30 | 2024-04-30 |
    +------------+------------+
    1 row in set (0.00 sec)
    
  • TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

    Возвращает datetime_expr2 − datetime_expr1, где datetime_expr1 и datetime_expr2 — это выражения даты или datetime. Одно выражение может быть датой, а другое — datetime; значение даты обрабатывается как значение datetime, имеющее часть времени '00:00:00', если необходимо. Единица результата (целого числа) задается аргументом unit. Допустимые значения для unit такие же, как и те, что перечислены в описании функции TIMESTAMPADD().

    mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
            -> 3
    mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
            -> -1
    mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
            -> 128885
    
    Примечание

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

  • TIME_FORMAT(time,format)

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

    Если значение 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)

    Возвращает аргумент time, преобразованный во секунды.

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

    При заданной дате date, возвращает номер дня (количество дней с года 0).

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

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

    Помните, что MySQL преобразует значения двузначных годов в датах в четырехзначный вид, используя правила, описанные в разделе 11.2, «Типы данных даты и времени». Например, '2008-10-07' и '08-10-07' рассматриваются как идентичные даты:

    mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07');
            -> 733687, 733687
    

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

    mysql> SELECT TO_DAYS('0000-00-00');
    +-----------------------+
    | to_days('0000-00-00') |
    +-----------------------+
    |                  NULL |
    +-----------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Incorrect datetime value: '0000-00-00' |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    
    mysql> SELECT TO_DAYS('0000-01-01');
    +-----------------------+
    | to_days('0000-01-01') |
    +-----------------------+
    |                     1 |
    +-----------------------+
    1 row in set (0.00 sec)
    

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

  • TO_SECONDS(expr)

    При заданной дате или datetime expr, возвращает количество секунд с года 0. Если expr не является допустимым значением даты или datetime, возвращает 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() );
            -> 63426721458
    

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

    Как и TO_DAYS(), TO_SECONDS() преобразует значения двузначных годов в датах в четырехзначный вид, используя правила, описанные в разделе 11.2, «Типы данных даты и времени».

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

    mysql> SELECT TO_SECONDS('0000-00-00');
    +--------------------------+
    | TO_SECONDS('0000-00-00') |
    +--------------------------+
    |                     NULL |
    +--------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Incorrect datetime value: '0000-00-00' |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    
    mysql> SELECT TO_SECONDS('0000-01-01');
    +--------------------------+
    | TO_SECONDS('0000-01-01') |
    +--------------------------+
    |                    86400 |
    +--------------------------+
    1 row in set (0.00 sec)
    

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

  • UNIX_TIMESTAMP([date])

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

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

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

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

    Допустимый диапазон значений аргумента такой же, как и для типа данных TIMESTAMP: от '1970-01-01 00:00:01.000000' UTC до '2038-01-19 03:14:07.999999' UTC. Если вы передадите значение даты, выходящее за пределы диапазона, функции UNIX_TIMESTAMP() вернёт 0.

    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, преобразование является потерей, поскольку соответствие не является взаимно однозначным в обоих направлениях. Например, из-за правил изменения часовых поясов, таких как летнее время, возможно, что UNIX_TIMESTAMP() отобразит два различных значения в часовой зоне, отличной от UTC, в одной метке времени Unix. FROM_UNIXTIME() отображает это значение только в одно из исходных значений. Вот пример, использующий значения, которые различаются во временной зоне MET:

    mysql> SET time_zone = 'MET';
    mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
    +---------------------------------------+
    | UNIX_TIMESTAMP('2005-03-27 03:00:00') |
    +---------------------------------------+
    |                            1111885200 |
    +---------------------------------------+
    mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
    +---------------------------------------+
    | UNIX_TIMESTAMP('2005-03-27 02:00:00') |
    +---------------------------------------+
    |                            1111885200 |
    +---------------------------------------+
    mysql> SELECT FROM_UNIXTIME(1111885200);
    +---------------------------+
    | FROM_UNIXTIME(1111885200) |
    +---------------------------+
    | 2005-03-27 03:00:00       |
    +---------------------------+
    
    Примечание

    Для использования именованных временных зон, таких как 'MET' или 'Europe/Amsterdam', таблицы временных зон должны быть должным образом настроены. Инструкции см. в разделе 5.1.13, «Поддержка временных зон MySQL-сервера».

    Если вы хотите вычесть столбцы UNIX_TIMESTAMP(), возможно, вам нужно привести их к целочисленным значениям со знаком. См. раздел 12.10, «Функции и операторы приведения типов».

  • UTC_DATE, UTC_DATE()

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

    mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
            -> '2003-08-14', 20030814
    
  • UTC_TIME, UTC_TIME([fsp])

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

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

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
            -> '18:07:53', 180753.000000
    
  • UTC_TIMESTAMP, UTC_TIMESTAMP([fsp])

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

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

    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
            -> '2003-08-14 18:08:04', 20030814180804.000000
    
  • WEEK(date[,mode])

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

    Следующая таблица описывает, как работает аргумент mode.

    Режим Первый день недели Диапазон Неделя 1 — это первая неделя …
    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 содержащая понедельник в этом году

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

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

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

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

    Если дата попадает на последнюю неделю предыдущего года, 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)

    Возвращает индекс дня недели для date (0 = понедельник, 1 = вторник, … 6 = воскресенье).

    mysql> SELECT WEEKDAY('2008-02-03 22:23:00');
            -> 6
    mysql> SELECT WEEKDAY('2007-11-06');
            -> 1
    
  • WEEKOFYEAR(date)

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

    mysql> SELECT WEEKOFYEAR('2008-02-20');
            -> 8
    
  • YEAR(date)

    Возвращает год для date в диапазоне от 1000 до 9999 или 0 для даты “ноль”.

    mysql> SELECT YEAR('1987-01-01');
            -> 1987
    
  • YEARWEEK(date), YEARWEEK(date,mode)

    Возвращает год и неделю для даты. Год в результате может отличаться от года в аргументе даты для первой и последней недели года.

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

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

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/date-and-time-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API