Spec-Zone.ru › MySQL 9.2

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

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

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

Таблица 14.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() предполагает, что её аргумент является значением даты и времени в часовом поясе текущей сессии. См. Раздел 7.1.15, «Поддержка часовых поясов сервера MySQL».

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

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

  • ADDTIME(expr1,expr2)

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

    Тип возвращаемого значения этой функции и функции 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'
    
  • CONVERT_TZ(dt,from_tz,to_tz)

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

    На 32-битных платформах поддерживаемый диапазон значений для этой функции такой же, как и для типа TIMESTAMP (см. Раздел 13.2.1 «Синтаксис типов данных даты и времени» для информации о диапазоне). На 64-битных платформах максимальное поддерживаемое значение равно '3001-01-18 23:59:59.999999' UTC.

    Независимо от платформы или версии MySQL, если значение выходит за поддерживаемый диапазон при преобразовании из from_tz в UTC, преобразование не выполняется.

    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', необходимо правильно настроить таблицы часовых поясов. Инструкции см. в Разделе 7.1.15 «Поддержка часовых поясов MySQL Server».

  • 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();
    +-----------+
    | CURTIME() |
    +-----------+
    | 19:25:37  |
    +-----------+
    
    mysql> SELECT CURTIME() + 0;
    +---------------+
    | CURTIME() + 0 |
    +---------------+
    |        192537 |
    +---------------+
    
    mysql> SELECT CURTIME(3);
    +--------------+
    | CURTIME(3)   |
    +--------------+
    | 19:25:37.840 |
    +--------------+
    
  • DATE(expr)

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

    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
    

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

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

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

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

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

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

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

    • TIME, если аргумент date является значением TIME и вычисления включают только HOURS, MINUTES и SECONDS части (то есть без частей даты).

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

    • Если первый аргумент является динамическим параметром (например, подготовленного оператора), его тип после разрешения — DATE, если второй аргумент — интервал, содержащий только некоторые комбинации значений YEAR, MONTH или DAY; в противном случае его тип — DATETIME.

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

    Чтобы убедиться, что результат является 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. Если любой из аргументов имеет значение NULL, функция возвращает NULL.

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

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

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

    Для спецификаторов %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 (см. Раздел 12.16, “Поддержка локали MySQL Server”). Возвращает NULL, если date равно NULL.

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

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

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

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

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

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

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

    Функция EXTRACT() использует те же типы спецификаторов unit, что и DATE_ADD() или DATE_SUB(), но извлекает части даты вместо выполнения арифметических операций с датой. Сведения об аргументе unit см. в разделе Временные интервалы. Возвращает 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 '2003-01-02 10:30:00.000123');
            -> 123
    
  • FROM_DAYS(N)

    При заданном номере дня N, возвращает значение DATE. Возвращает NULL, если N является NULL.

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

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

  • FROM_UNIXTIME(unix_timestamp[,format])

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

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

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

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

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

    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().

    Если format является 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'

    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. Возвращает NULL, если time является NULL.

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

    Принимает значение даты или даты и времени и возвращает соответствующее значение для последнего дня месяца. Возвращает NULL, если аргумент некорректен или 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. Результат также 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)

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

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

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

    Возвращает микросекунды из выражения времени или даты и времени 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)

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

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

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

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

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

    mysql> SELECT MONTHNAME('2008-02-03');
            -> 'February'
    
  • NOW([fsp])

    Возвращает текущую дату и время в формате '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(P,N)

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

    Примечание

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

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

    mysql> SELECT PERIOD_ADD(200801,2);
            -> 200803
    
  • PERIOD_DIFF(P1,P2)

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

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

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

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

    mysql> SELECT QUARTER('2008-04-01');
            -> 2
    
  • SECOND(time)

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

    mysql> SELECT SECOND('10:05:03');
            -> 3
    
  • SEC_TO_TIME(seconds)

    Возвращает аргумент 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)

    Это обратная функция к DATE_FORMAT(). Она принимает строку str и строку формата format. STR_TO_DATE() возвращает значение DATETIME, если строка формата содержит как части даты, так и времени, или значение DATE или TIME, если строка содержит только части даты или времени. Если str или format имеют значение NULL, функция возвращает NULL. Если значение даты, времени или даты и времени, извлечённое из 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'
    

    Проверка диапазонов для частей значений дат описана в разделе 13.2.2 «Типы DATE, DATETIME и TIMESTAMP». Это означает, например, что разрешены даты со значением 0 или даты с частями со значениями 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, даты со значением 0 запрещены. В этом случае 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 было возможно передать в эту функцию некорректную строку даты, такую как '2021-11-31'. В MySQL 9.2 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-режима ALLOW_INVALID_DATES не влияет на это поведение. Дополнительную информацию см. в разделе 13.2.2 «Типы DATE, DATETIME и TIMESTAMP».

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

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

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

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

  • SUBTIME(expr1,expr2)

    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])

    Возвращает текущую дату и время в формате '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)

    Извлекает часть времени из выражения времени или даты и времени expr и возвращает её как строку. Возвращает NULL, если expr имеет значение NULL.

    Эта функция небезопасна для репликации на основе запросов. Если вы используете эту функцию, когда 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; после преобразования они должны быть одного типа. Возвращает 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('2008-12-31 23:59:59.000001',
        ->                 '2008-12-30 01:01:01.000002');
            -> '46:58:57.999999'
    
  • TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

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

    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_expr. Единица измерения для interval задается аргументом unit, который должен быть одним из следующих значений: MICROSECOND (микросекунды), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER или YEAR.

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

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

    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 — выражения даты или даты и времени. Одно выражение может быть датой, а другое — датой и временем; значение даты рассматривается как значение даты и времени со временной частью '00:00:00' при необходимости. Единица измерения результата (целое число) задаётся аргументом unit. Допустимые значения для unit совпадают с теми, что перечислены в описании функции TIMESTAMPADD().

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

    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
    
    Примечание

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

  • TIME_FORMAT(time,format)

    Используется подобно функции DATE_FORMAT(), но строка format может содержать спецификаторы формата только для часов, минут, секунд и микросекунд. Другие спецификаторы приводят к NULL или 0. TIME_FORMAT() возвращает NULL, если time или format имеют значение 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)

    Возвращает аргумент 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)

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

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

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

    Помните, что MySQL преобразует значения двухзначных годов в датах в четырёхзначный вид, используя правила в Разделе 13.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)

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

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

    Как и TO_DAYS(), TO_SECONDS() преобразует значения двухзначных годов в датах в четырёхзначный вид, используя правила в Разделе 13.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.

END_OF_DOCUMENT_MARKER
  • 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. (Клиенты могут задать временную зону сессии, как описано в Разделе 7.1.15, «Поддержка временных зон MySQL Server».) Аргумент 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 для 32-битных платформ; для MySQL, работающего на 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. Если date является 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');
    +---------------------------------------+
    | 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', таблицы временных зон должны быть должным образом настроены. Инструкции см. в Разделе 7.1.15, «Поддержка временных зон MySQL Server».

    Если вы хотите вычесть столбцы UNIX_TIMESTAMP(), вы можете преобразовать их в целые со знаком. См. Раздел 14.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. См. Раздел 7.1.8, «Системные переменные сервера». Для значения даты NULL функция возвращает NULL.

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

    Режим Первый день недели Диапазон Неделя 1 — это первая неделя …
    0 Воскресенье 0-53 с воскресеньем в этом году
    1 Понедельник 0-53 с четырьмя или более днями в этом году
    2 Воскресенье 1-53 с воскресеньем в этом году
    3 Понедельник 1-53 с четырьмя или более днями в этом году
    4 Воскресенье 0-53 с четырьмя или более днями в этом году
    5 Понедельник 0-53 с понедельником в этом году
    6 Воскресенье 1-53 с четырьмя или более днями в этом году
    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 = воскресенье). Возвращает NULL, если date является NULL.

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

    Возвращает календарную неделю даты как число в диапазоне от 1 до 53. Возвращает NULL, если date равно NULL.

    WEEKOFYEAR() — функция совместимости, эквивалентная WEEK(date,3).

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

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

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

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

    Аргумент 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-9.2-en/date-and-time-functions.html

Spec-Zone.ru

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