14.7 Функции даты и времени
В этом разделе описаны функции, которые можно использовать для обработки временных значений. См. раздел 13.2, «Типы данных даты и времени», для описания диапазона значений каждого типа даты и времени и допустимых форматов, в которых могут быть указаны значения.
Таблица 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,INTERVALexprunit)ADDDATE(date,days)При вызове с
INTERVALформой второго аргумента,ADDDATE()является синонимом дляDATE_ADD(). Связанная функцияSUBDATE()является синонимом дляDATE_SUB(). Для получения информации об аргументеINTERVALunitсм. Временные интервалы.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()добавляет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, и возвращает полученное значение. Часовые пояса задаются, как описано в Разделе 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». -
Возвращает текущую дату в формате
'илиYYYY-MM-DD'YYYYMMDD, в зависимости от того, используется ли функция в строковом или числовом контексте.mysql>
SELECT CURDATE();-> '2008-06-13' mysql>SELECT CURDATE() + 0;-> 20080613 -
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(). -
Возвращает текущее время в формате
'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 | +--------------+ -
Извлекает часть даты из выражения даты или даты и времени
expr. ВозвращаетNULL, еслиexprявляетсяNULL.mysql>
SELECT DATE('2003-12-31 01:02:03');-> '2003-12-31' -
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,INTERVALexprunit)DATE_SUB(date,INTERVALexprunit)Эти функции выполняют арифметические операции с датами. Аргумент
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. Если любой из аргументов имеет значение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)%pAMили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Год, числовое значение (две цифры) %%Символ %%xxдля любого “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,INTERVALexprunit)См. описание функции
DATE_ADD(). -
DAY()является синонимом дляDAYOFMONTH(). -
Возвращает название дня недели для
date. Язык, используемый для названия, определяется значением системной переменнойlc_time_names(см. Раздел 12.16, “Поддержка локали MySQL Server”). ВозвращаетNULL, еслиdateравноNULL.mysql>
SELECT DAYNAME('2007-02-03');-> 'Saturday' -
Возвращает число месяца для
dateв диапазоне от1до31или0для дат, таких как'0000-00-00'или'2008-00-00', у которых нулевая часть дня. ВозвращаетNULL, еслиdateравноNULL.mysql>
SELECT DAYOFMONTH('2007-02-03');-> 3 -
Возвращает индекс дня недели для
date(1= воскресенье,2= понедельник, …,7= суббота). Эти индексы соответствуют стандарту ODBC. ВозвращаетNULL, еслиdateравноNULL.mysql>
SELECT DAYOFWEEK('2007-02-03');-> 7 -
Возвращает номер дня в году для
dateв диапазоне от1до366. ВозвращаетNULL, еслиdateравноNULL.mysql>
SELECT DAYOFYEAR('2007-02-03');-> 34 -
Функция
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
-
При заданном номере дня
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' -
Возвращает час для
time. Диапазон возвращаемого значения составляет от0до23для значений времени суток. Однако диапазон значенийTIMEна самом деле намного больше, поэтомуHOURможет возвращать значения больше, чем23. ВозвращаетNULL, еслиtimeявляетсяNULL.mysql>
SELECT HOUR('10:05:03');-> 10 mysql>SELECT HOUR('272:59:59');-> 272 -
Принимает значение даты или даты и времени и возвращает соответствующее значение для последнего дня месяца. Возвращает
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()являются синонимами дляNOW(). -
LOCALTIMESTAMP,LOCALTIMESTAMP([fsp])LOCALTIMESTAMPиLOCALTIMESTAMP()являются синонимами дляNOW(). -
Возвращает дату, заданную значениями года и дня года.
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 -
Возвращает значение времени, вычисленное из аргументов
hour,minuteиsecond. ВозвращаетNULL, если любой из аргументов являетсяNULL.Аргумент
secondможет иметь дробную часть.mysql>
SELECT MAKETIME(12,15,30);-> '12:15:30'
-
Возвращает микросекунды из выражения времени или даты и времени
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 -
Возвращает минуту для
timeв диапазоне от0до59илиNULL, еслиtimeимеет значениеNULL.mysql>
SELECT MINUTE('2008-02-03 10:05:03');-> 5 -
Возвращает номер месяца для
dateв диапазоне от1до12для января-декабря или0для дат, таких как'0000-00-00'или'2008-00-00', имеющих нулевую часть месяца. ВозвращаетNULL, еслиdateимеет значениеNULL.mysql>
SELECT MONTH('2008-02-03');-> 2 -
Возвращает полное имя месяца для
date. Язык, используемый для названия, определяется значением системной переменнойlc_time_names(Раздел 12.16, «Поддержка локали MySQL Server»). ВозвращаетNULL, еслиdateимеет значениеNULL.mysql>
SELECT MONTHNAME('2008-02-03');-> 'February' -
Возвращает текущую дату и время в формате
'илиYYYY-MM-DD hh:mm:ss'YYYYMMDDhhmmssв зависимости от того, используется ли функция в строковом или числовом контексте. Значение выражается во временной зоне сессии.Если аргумент
fspзадан для указания точности дробных секунд от 0 до 6, возвращаемое значение включает дробную часть секунд с указанным количеством знаков.mysql>
SELECT NOW();-> '2007-12-15 23:50:26' mysql>SELECT NOW() + 0;-> 20071215235026.000000NOW()возвращает постоянное время, указывающее момент начала выполнения оператора. (Внутри хранимой функции или триггера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()для получения дополнительной информации о различиях между двумя функциями. -
Добавляет
Nмесяцев к периодуP(в форматеYYMMилиYYYYMM). Возвращает значение в форматеYYYYMM.ПримечаниеАргумент периода
Pне является значением даты.Эта функция возвращает
NULL, еслиPилиNимеют значениеNULL.mysql>
SELECT PERIOD_ADD(200801,2);-> 200803 -
Возвращает количество месяцев между периодами
P1иP2.P1иP2должны быть в форматеYYMMилиYYYYMM. Обратите внимание, что аргументы периодаP1иP2не являются значениями дат.Эта функция возвращает
NULL, еслиP1илиP2имеют значениеNULL.mysql>
SELECT PERIOD_DIFF(200802,200703);-> 11 -
Возвращает квартал года для
dateв диапазоне от1до4илиNULL, еслиdateимеет значениеNULL.mysql>
SELECT QUARTER('2008-04-01');-> 2 -
Возвращает секунды для
timeв диапазоне от0до59илиNULL, еслиtimeимеет значениеNULL.mysql>
SELECT SECOND('10:05:03');-> 3 -
Возвращает аргумент
seconds, преобразованный в часы, минуты и секунды, как значениеTIME. Диапазон результата ограничен типом данныхTIME. В случае, если аргумент соответствует значению за пределами этого диапазона, возникает предупреждение.Функция возвращает
NULL, еслиsecondsимеет значениеNULL.mysql>
SELECT SEC_TO_TIME(2378);-> '00:39:38' mysql>SELECT SEC_TO_TIME(2378) + 0;-> 3938
-
Это обратная функция к
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.2STR_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,INTERVALexprunit)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в формате, аналогичном формату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. -
Возвращает текущую дату и время в формате
'или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()также означает, что индексы не могут использоваться для вычисления выражений, которые на неё ссылаются. -
Извлекает часть времени из выражения времени или даты и времени
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, выраженное в виде временного значения.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 аргументами. -
Используется подобно функции
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, преобразованный в секунды. ВозвращаетNULL, еслиtimeимеет значениеNULL.mysql>
SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql>SELECT TIME_TO_SEC('00:39:38');-> 2378 -
Принимая дату
date, возвращает номер дня (количество дней с года 0). ВозвращаетNULL, еслиdateимеет значениеNULL.mysql>
SELECT TO_DAYS(950501);-> 728779 mysql>SELECT TO_DAYS('2007-10-07');-> 733321TO_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. -
Принимая дату или дату и время
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.
-
Если функция
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 в формате
'илиYYYY-MM-DD'YYYYMMDD, в зависимости от того, используется ли функция в строковом или числовом контексте.mysql>
SELECT UTC_DATE(), UTC_DATE() + 0;-> '2003-08-14', 20030814 -
Возвращает текущее время 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
-
Эта функция возвращает номер недели для
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' -
Возвращает индекс дня недели для
date(0= понедельник,1= вторник, …6= воскресенье). ВозвращаетNULL, еслиdateявляетсяNULL.mysql>
SELECT WEEKDAY('2008-02-03 22:23:00');-> 6 mysql>SELECT WEEKDAY('2007-11-06');-> 1 -
Возвращает календарную неделю даты как число в диапазоне от
1до53. ВозвращаетNULL, еслиdateравноNULL.WEEKOFYEAR()— функция совместимости, эквивалентнаяWEEK(.date,3)mysql>
SELECT WEEKOFYEAR('2008-02-20');-> 8 -
Возвращает год для
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.