В этом разделе описываются функции, которые можно использовать для управления временными значениями, для описания диапазона значений каждого типа даты и времени и допустимых форматов, в которых значения могут быть указаны.
Пример, в котором используются функции даты. Следующий запрос выбирает все строки со значением date_col
за последние 30 дней:
mysql> SELECT something FROM tbl_name -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
Запрос также выбирает строки с датами, которые лежат в будущем.
Функции, которые ожидают значения даты, обычно принимают значения даты и времени и игнорируют часть времени. Функции, которые ожидают значения времени, обычно принимают значения даты и времени и игнорируют часть даты.
Некоторые функции даты можно использовать с "нулевыми" датами или неполными датами, такими как '2001-11-00'
, тогда как другие не могут. Функции, которые извлекают части дат, обычно работают с неполными датами и, таким образом, могут возвращать 0, когда в противном случае можно было бы ожидать ненулевое значение. Например:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00'); -> 0, 0
Другие функции ожидают полных дат и возвращают NULL
для неполных дат. К ним относятся функции, которые выполняют арифметические операции с датами или сопоставляют части дат с именами. Например:
mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY); -> NULL mysql> SELECT DAYNAME('2006-05-00'); -> NULL
ADDDATE()
добавляет к дате временной интервал,ADDTIME()
добавляет к времени временной интервал,CURDATE()
возвращает текущую дату,CURTIME()
возвращает текущее время,CURRENT_DATE()
возвращает текущую дату,CURRENT_TIME()
возвращает текущее время,CURRENT_TIMESTAMP()
возвращает текущее время,DATE()
извлекает дату,DATEDIFF()
возвращает разницу в датах в виде дней,DATE_ADD()
добавляет к дате временной интервал,DATE_SUB()
вычитает из даты временной интервал,DATE_FORMAT()
форматирует дату в соответствии с форматом,DAYNAME()
возвращает название дня недели для даты,DAYOFMONTH()
возвращает день месяца для даты,DAYOFWEEK()
возвращает индекс дня недели для даты,DAYOFYEAR()
возвращает день года для даты в диапазоне от 1 до 366,EXTRACT()
извлекает части из даты,FROM_DAYS()
учитывая номер дня, возвращает значение DATE
,FROM_UNIXTIME()
переводит unix_timestamp
в значения DATETIME
,GET_FORMAT()
возвращает строку формата,HOUR()
возвращает час,LAST_DAY()
для даты возвращает последний день месяца,MAKEDATE()
собирает DATE
из года и количества дней, прошедших с начала года,MAKETIME()
собирает TIME
из hour
, minute
и second
,MICROSECOND()
возвращает микросекунды,MINUTE()
возвращает минуты,MONTH()
возвращает месяц из даты,MONTHNAME()
возвращает полное название месяца из даты,NOW()
возвращает текущую дату и время DATETIME
,PERIOD_ADD()
добавляет N
месяцев к периоду P
,PERIOD_DIFF()
возвращает количество месяцев между периодами P1
и P2
,QUARTER()
возвращает квартал года из даты,SECOND()
возвращает секунды,SEC_TO_TIME()
преобразует секунды в часы, минуты и секунды,STR_TO_DATE()
обратная функция DATE_FORMAT()
,SUBDATE()
является синонимом DATE_SUB()
,SUBTIME()
вычитает временной интервал,SYSDATE()
возвращает текущее системное дату и время,TIME()
извлекает временную часть из даты,TIMEDIFF()
возвращает разницу в датах, выраженное как TIME
,TIMESTAMP()
преобразует DATE
или TIME
в значения DATETIME
,TIMESTAMPADD()
добавляет к дате интервал, выраженный в секундах или (минутах, часах, днях, неделях и т.д.),TIMESTAMPDIFF()
вычитает из даты интервал, выраженный в секундах или (минутах, часах, днях, неделях и т.д.) ,TIME_FORMAT()
используется аналогично функции DATE_FORMAT
, только для времени,TIME_TO_SEC()
преобразовывает время в секунды,TO_DAYS()
возвращает количество дней, прошедших с 0 года,TO_SECONDS()
возвращает количество секунд, прошедших с 0 года,UNIX_TIMESTAMP()
возвращает время Unix переданной даты или текущее время Unix,UTC_DATE
возвращает текущую дату UTC UTC,UTC_TIME
возвращает текущее время UTC,UTC_TIMESTAMP
возвращает текущую дату и время UTC,WEEK()
возвращает номер недели для даты в году,WEEKDAY()
возвращает номер дня недели для даты,WEEKOFYEAR()
возвращает календарную неделю даты,YEAR()
извлекает год для даты,YEARWEEK()
возвращает год и неделю для даты,ADDDATE(date, INTERVAL expr unit)
ADDDATE(date, days)
:При вызове ADDDATE()
с ключевым словом INTERVAL
, функция является синонимом для DATE_ADD()
. Родственная функция SUBDATE()
является синонимом DATE_SUB()
. Сведения об аргументе единицы unit
смотрите в разделе "Встроенные БД MySQL интервалы времени".
mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02' mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02'
При вызове с другой формой передачи аргумента MySQL обрабатывает его как целое число дней, которое нужно добавить к expr
.
mysql> SELECT ADDDATE('2008-01-02', 31); -> '2008-02-02'
Эта функция возвращает значение NULL
, если значение date
или days
равно NULL
.
ADDTIME(expr1,expr2)
:MySQL функция ADDTIME()
добавляет expr2
к expr1
и возвращает результат. Аргумент expr1
- это выражение TIME
или DATETIME
, а expr2
- выражение времени TIME
. Возвращает NULL
, если expr1
или expr2
имеет значение NULL
.
Начиная с MySQL 8.0.28 (узнать версию SELECT VERSION();
), тип возвращаемого значения этой функции и функции SUBTIME()
определяется следующим образом:
TIME
.mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002'); -> '2008-01-02 01:01:01.000001' mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); -> '03:00:01.999997'
CURDATE()
,CURRENT_DATE()
:MySQL функция CURDATE()
(CURRENT_DATE()
) возвращает текущую дату в виде значения в формате 'YYYY-MM-DD'
или YYYYMMDD
, в зависимости от того, используется ли функция в строковом или числовом контексте.
mysql> SELECT CURDATE(); -> '2022-06-30' mysql> SELECT CURDATE() + 0; -> 20220630
CURTIME([fsp])
,CURRENT_TIME([fsp])
:MySQL функция CURTIME()
(CURRENT_TIME()
) возвращает текущее время в виде значения в формате 'hh:mm:ss'
или hhmmss
, в зависимости от того, используется ли функция в строковом или числовом контексте. Значение выражается в часовом поясе сеанса.
Если аргумент fsp
задан (необязательный) для указания точности в дробных секундах от 0 до 6, то возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.
mysql> SELECT CURTIME(); -> 19:25:37 mysql> SELECT CURTIME() + 0; -> 192537 mysql> SELECT CURTIME(3); -> 19:25:37.840
DATE(expr)
:MySQL функция DATE()
извлекает часть даты из выражения expr
. Возвращает значение NULL, если expr
равно NULL.
mysql> SELECT DATE('2022-12-31 01:02:03'); -> '2022-12-31'
DATEDIFF(expr1, expr2)
:MySQL функция DATEDIFF()
возвращает expr1 − expr2
, выраженное в виде значения в днях от одной даты до другой. выражения expr1
и expr2
являются выражениями даты или даты и времени. В вычислении используются только части значений, относящиеся к дате.
mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); -> 1 mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31'); -> -31
Функция возвращает NULL, если expr1
или expr2
имеют значение NULL.
DATE_ADD(date, INTERVAL expr unit)
,DATE_SUB(date, INTERVAL expr unit)
:Эти функции выполняют арифметические операции с датами. Аргумент date
указывает начальную дату или значение даты и времени. Аргумент expr
- это выражение, определяющее значение интервала, которое нужно добавить или вычесть из начальной даты. Выражение expr
оценивается как строка, может начинаться с минуса -
для отрицательных интервалов. Ключевое слово unit
указывает единицы измерения, в которых следует интерпретировать выражение.
Дополнительные сведения о синтаксисе временного интервала, включая полный список спецификаторов единиц измерения, ожидаемую форму аргумента expr
для каждого значения единицы измерения и правила интерпретации операндов во временной арифметике, смотрите в главе "Встроенные БД MySQL интервалы времени".
Возвращаемое значение зависит от аргументов:
date
равна NULL, то функция возвращает NULL.DATE
, если аргумент date
является значением DATE
и расчеты включают только части YEAR
, MONTH
и DAY
(то есть без частей времени).TIME
, если аргумент date
является значением TIME
, и вычисления включают только части HOURS
, MINUTES
и SECONDS
(то есть без частей даты). (MySQL 8.0.28 и более поздние версии:)DATETIME
, если первым аргументом является значение DATETIME
(или TIMESTAMP
), или если первым аргументом является DATE
, а значение единицы измерения использует HOURS
, MINUTES
или SECONDS
, или если первый аргумент имеет тип TIME
, а значение единицы измерения использует YEAR
, MONTH
или DAY
.DATE
, если второй аргумент - это интервал, содержащий некоторую комбинацию YEAR
, MONTH
или DAY
только ценности. В противном случае его тип - DATETIME
. (MySQL 8.0.28 и более поздние версии:)VARCHAR
).Примечание. В версиях MySQL с 8.0.22 по 8.0.27 при использовании в подготовленных операторах эти функции возвращали значения
DATETIME
независимо от типов аргументов. (Ошибка № 103781)
Чтобы убедиться, что результатом является DATETIME
, можно использовать CAST()
для преобразования первого аргумента в DATETIME
.
mysql> SELECT DATE_ADD('2018-05-01', INTERVAL 1 DAY); -> '2018-05-02' mysql> SELECT DATE_ADD('2022-10-01', INTERVAL 3 MONTH) - INTERVAL 10 DAY; -> '2022-12-22' mysql> SELECT DATE_SUB('2022-10-01', INTERVAL 3 MONTH) + INTERVAL 10 DAY; -> '2022-07-11' mysql> SELECT DATE_SUB('2018-05-01', INTERVAL 1 YEAR); -> '2017-05-01' mysql> SELECT DATE_ADD('2020-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '2021-01-01 00:00:00' mysql> SELECT DATE_ADD('2018-12-31 23:59:59', -> INTERVAL 1 DAY); -> '2019-01-01 23:59:59' mysql> SELECT DATE_ADD('2100-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); -> '2101-01-01 00:01:00' mysql> SELECT DATE_SUB('2025-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '2024-12-30 22:58:59' mysql> SELECT DATE_ADD('1900-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR); -> '1899-12-30 14:00:00' mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'
DATE_FORMAT(date, format)
:MySQL функция DATE_FORMAT()
форматирует значение даты в соответствии со строкой формата. Если любой из аргументов имеет значение NULL
, то функция возвращает значение NULL
.
Спецификаторы, указанные ниже, могут использоваться в строке аргумента format
. Символ %
требуется перед символами спецификатора формата. Спецификаторы применимы и к другим функциям: STR_TO_DATE()
, TIME_FORMAT()
, UNIX_TIMESTAMP()
.
Спецификаторы используемые в строке формата:
%a
- Сокращенное название дня недели (Sun..Sat)%b
- Сокращенное название месяца (Jan..Dec)%c
- Месяц, число (0..12)%D
- День месяца с английским суффиксом (0th, 1st, 2nd, 3rd, …)%d
- День месяца, число (00..31)%e
- День месяца, число (0..31)%f
- Микросекунда (000000..999999)%H
- Час (00..23)%h
- Час (01..12)%I
- Час (01..12)%i
- Минуты, число (00..59)%j
- День года (001..366)%k
- Час (0..23)%l
- Час (1..12)%M
- Название месяца (January..December)%m
- Месяц, число (00..12)%p
- AM или PM%r
- Время, 12 часовой формат (hh:mm:ss
с последующим AM или PM)%S
- Секунды (00..59)%s
- Секунды (00..59)%T
- Время, 24 часовой формат (hh:mm:ss
)%U
- Неделя (00..53), где воскресенье - первый день недели; в функции WEEK()
режим mode=0
%u
- Неделя (00..53), где понедельник - первый день недели; в функции WEEK()
режим mode=1
%V
- Неделя (01..53), где воскресенье - первый день недели; в функции WEEK()
режим mode=2
; используется с %X
%v
- Неделя (01..53), где понедельник - первый день недели; в функции WEEK()
режим mode=3
; используется с %x
%W
- Название дня недели (Sunday..Saturday)%w
- День недели (0=Sunday..6=Saturday)%X
- Год недели, где воскресенье - первый день недели, четырехзначное число; используется с %V
%x
- Год недели, где понедельник - первый день недели, четырехзначное число; используется с %v
%Y
- Год, число из четырех цифр%y
- Год, число из двух цифр%%
- Буквальный символ %
Диапазоны для спецификаторов месяца и дня начинаются с нуля из-за того, что MySQL позволяет хранить неполные даты, такие как '2014-00-00'.
Язык, используемый для названий дней и месяцев и сокращений, управляется значением системной переменной lc_time_names
. Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names
может быть установлена в значение 'ru_RU'
. Набор локалей, поддерживаемых MySQL, может отличаться от поддерживаемых операционной системой.
Спецификаторы %U
, %u
, %V
и %v
в описании функции WEEK()
для получения информации о значениях режима. Режим влияет на то, как происходит нумерация недель.
Функция DATE_FORMAT()
возвращает строку с набором символов и параметрами сортировки, заданными с помощью character_set_connection
и collation_connection
, чтобы она могла возвращать названия месяцев и дней недели, содержащие символы, отличные от ASCII.
mysql> SET @@lc_time_names='ru_RU'; mysql> SELECT @@lc_time_names; -> 'ru_RU' mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Воскресенье Октября 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Чтв 04 10 Окт 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00'
DAYNAME(date)
:MySQL функция DAYNAME()
возвращает название дня недели для date
. Язык, используемый для дня недели, управляется значением системной переменной lc_time_names
. Возвращает NULL
, если дата равна NULL
.
Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names
может быть установлена в значение 'ru_RU'
.
mysql> SET @@lc_time_names='ru_RU'; mysql> SELECT @@lc_time_names; -> 'ru_RU' mysql> SELECT DAYNAME('2007-02-03'); -> 'Суббота'
DAYOFMONTH(date)
:MySQL функция DAYOFMONTH()
возвращает день месяца для даты в диапазоне от 1 до 31 или 0 для таких дат, как '0000-00-00'
или 2022-00-00'
, которые имеют нулевую часть дня. Возвращает значение NULL
, если значение date равно NULL
.
mysql> SELECT DAYOFMONTH('2022-02-03'); -> 3
DAYOFWEEK(date)
:MySQL функция DAYOFWEEK()
возвращает индекс дня недели для даты (1 = Sunday, 2 = Monday, …, 7 = Saturday). Эти значения индекса соответствуют стандарту ODBC. Возвращает NULL
, если дата равна NULL
.
mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7
DAYOFYEAR(date)
:MySQL функция DAYOFYEAR()
возвращает день года для даты в диапазоне от 1 до 366. Возвращает значение NULL
, если значение date
равно NULL
.
mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34
EXTRACT(unit FROM date)
:MySQL функция EXTRACT()
использует те же типы спецификаторов единиц измерения unit
, что и DATE_ADD()
или DATE_SUB()
, но извлекает части из даты, а не выполняет арифметические операции с датами. Для получения информации об аргументе unit
смотрите "Встроенные БД MySQL интервалы времени". Возвращает NULL
, если date
равна NULL
.
mysql> SELECT EXTRACT(YEAR FROM '2019-07-02'); -> 2019 mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03'); -> 201907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2022-01-02 10:30:00.000123'); -> 123
FROM_DAYS(N)
:MySQL функция FROM_DAYS()
учитывая номер дня N
, возвращает значение DATE
. Возвращает значение NULL
, если N
равно NULL
.
mysql> SELECT FROM_DAYS(730669); -> '2000-07-03'
Используйте
FROM_DAYS()
с осторожностью со старыми датами. Она не предназначен для использования со значениями, которые предшествуют появлению григорианского календаря.
FROM_UNIXTIME(unix_timestamp[,format])
:MySQL функция FROM_UNIXTIME()
возвращает представление unix_timestamp
в виде значения DATETIME
или символьной строки. Возвращаемое значение выражается с использованием часового пояса.
Если формат format
не указан, то эта функция возвращает значение DATETIME
.
Если unix_timestamp
или format
имеет значение NULL
, эта функция возвращает значение NULL
.
Если unix_timestamp
является целым числом, то точность DATETIME
в долях секунды равна нулю. Когда unix_timestamp
является десятичным значением, то точность DATETIME
в долях секунды совпадает с точностью десятичного значения. Когда unix_timestamp
является числом с плавающей запятой, то точность даты и времени в долях секунды равна 6.
На 32-разрядных платформах максимальное полезное значение для unix_timestamp
- 2147483647,999999, что возвращает '2038-01-19 03:14:07.999999'
UTC. На 64-битных платформах, работающих под управлением MySQL 8.0.28 или более поздней версии, эффективный максимум равен 32536771199,999999, что возвращает '3001-01-18 23:59:59.999999'
UTC. Независимо от платформы или версии большее значение unix_timestamp
, чем действующий максимум, возвращает 0.
Аргумент формата format
используется для форматирования результата так же, как строка формата, используемая для функции DATE_FORMAT()
. Если указан формат, то возвращаемое значение является VARCHAR
.
mysql> SELECT FROM_UNIXTIME(1447430881); -> '2015-11-13 10:08:01' mysql> SELECT FROM_UNIXTIME(1447430881) + 0; -> 20151113100801 mysql> SELECT FROM_UNIXTIME(1447430881, -> '%Y %D %M %h:%i:%s %x'); -> '2015 13th November 10:08:01 2015'
Примечание. Если используется
UNIX_TIMESTAMP()
иFROM_UNIXTIME()
для преобразования между значениями в часовом поясе, отличном от UTC, и значениями временной метки Unix, то преобразование будет с потерями, поскольку сопоставление не является однозначным в обоих направлениях.
GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
:MySQL функция GET_FORMAT()
возвращает строку формата. Эта функция полезна в сочетании с функциями DATE_FORMAT()
и STR_TO_DATE()
.
Если формат равен NULL
, эта функция возвращает значение NULL
.
Возможные значения для первого и второго аргументов приводят к нескольким возможным строкам формата (используемые спецификаторы смотрите в описании функции DATE_FORMAT()
). Формат ISO относится к ISO 9075, а не к ISO 8601.
GET_FORMAT(DATE, 'USA')
вернет строку формата '%m.%d.%Y'
GET_FORMAT(DATE, 'JIS')
вернет строку формата '%Y-%m-%d'
GET_FORMAT(DATE, 'ISO')
вернет строку формата '%Y-%m-%d'
GET_FORMAT(DATE, 'EUR')
вернет строку формата '%d.%m.%Y'
GET_FORMAT(DATE, 'INTERNAL')
вернет строку формата '%Y%m%d'
GET_FORMAT(DATETIME, 'USA')
вернет строку формата '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME, 'JIS')
вернет строку формата '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME, 'ISO')
вернет строку формата '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME, 'EUR')
вернет строку формата '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME, 'INTERNAL')
вернет строку формата '%Y%m%d%H%i%s'
GET_FORMAT(TIME, 'USA')
вернет строку формата '%h:%i:%s %p'
GET_FORMAT(TIME, 'JIS')
вернет строку формата '%H:%i:%s'
GET_FORMAT(TIME, 'ISO')
вернет строку формата '%H:%i:%s'
GET_FORMAT(TIME, 'EUR')
вернет строку формата '%H.%i.%s'
GET_FORMAT(TIME, 'INTERNAL')
вернет строку формата '%H%i%s'
В качестве первого аргумента для GET_FORMAT()
также может использоваться тип TIMESTAMP
, и в этом случае функция возвращает те же значения, что и для DATETIME
.
Как и где использовать функцию GET_FORMAT()
:
mysql> SELECT DATE_FORMAT('2022-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2022' mysql> SELECT STR_TO_DATE('10.31.2022',GET_FORMAT(DATE,'USA')); -> '2022-10-31'
HOUR(time)
:MySQL функция HOUR()
возвращает час для аргумента time
. Диапазон возвращаемого значения составляет от 0 до 23 для значений времени суток. Однако диапазон значений TIME
на самом деле намного больше, поэтому HOUR()
может возвращать значения больше 23. Возвращает NULL
, если время равно NULL
.
mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272
LAST_DAY(date)
:MySQL функция LAST_DAY()
принимает значение date
, которое может быть типами DATE
или DATETIME
и возвращает соответствующее значение для последнего дня месяца. Возвращает значение NULL
, если аргумент недействителен или равен NULL
.
mysql> SELECT LAST_DAY('2022-02-05'); -> '2022-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2022-03-32'); -> NULL
MAKEDATE(year, dayofyear)
:MySQL функция MAKEDATE()
возвращает дату, учитывая значения года year
и дня года dayofyear
. Аргумент dayofyear
должен быть больше 0, иначе результат будет NULL
. Результат также равен NULL
, если любой из аргументов равен NULL
.
mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32); -> '2011-01-31', '2011-02-01' mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365); -> '2011-12-31', '2014-12-31' mysql> SELECT MAKEDATE(2011,0); -> NULL
MAKETIME(hour, minute, second)
:MySQL функция MAKETIME()
возвращает значение времени, вычисленное из аргументов hour
, minute
и second
. Возвращает NULL
, если любой из его аргументов равен NULL
.
Второй аргумент может иметь дробную часть.
mysql> SELECT MAKETIME(12,15, 30); -> '12:15:30'
MICROSECOND(expr)
:MySQL функция MICROSECOND()
возвращает микросекунды из выражения TIME
или DATETIME
, которое может принимать аргумент expr
в виде числа в диапазоне от 0 до 999999. Возвращает значение NULL
, если expr
равно NULL
.
mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10
MINUTE(time)
:MySQL функция MINUTE()
возвращает минуту для времени time
в диапазоне от 0 до 59 или NULL
, если time
равно NULL
.
mysql> SELECT MINUTE('2022-02-03 10:05:03'); -> 5
MONTH(date)
:MySQL функция MONTH()
возвращает месяц для аргумента date
в диапазоне от 1 до 12 для января по декабрь или 0 для таких дат, как '0000-00-00'
или '2022-00-00'
, которые имеют нулевую часть месяца. Возвращает значение NULL
, если значение date
равно NULL
.
mysql> SELECT MONTH('2022-02-03'); -> 2
MONTHNAME(date)
:MySQL функция MONTHNAME()
возвращает полное название месяца для даты. Язык, используемый для название месяца, определяется значением системной переменной lc_time_names
. Возвращает значение NULL
, если значение date равно NULL
.
Для отображения названий на русском языке, переменная конфигурации MySQL сервера lc_time_names
может быть установлена в значение 'ru_RU'
. Набор локалей, поддерживаемых MySQL, может отличаться от поддерживаемых операционной системой.
-- установка локали на сеанс (подключение) mysql> SET @@lc_time_names='ru_RU'; mysql> SELECT @@lc_time_names; -> 'ru_RU' mysql> SELECT MONTHNAME('2022-02-03'); -> 'Февраля'
CURRENT_TIMESTAMP([fsp])
,NOW([fsp])
:MySQL функция NOW()
(CURRENT_TIMESTAMP()
) возвращает текущую дату и время в виде значения в формате 'YYYY-MM-DD hh:mm:ss'
или YYYYMMDDhhmmss
, в зависимости от того, используется ли функция в строковом или числовом контексте. Значение выражается в часовом поясе сеанса.
Если аргумент fsp
задан (необязательный) для указания точности в долях секунды от 0 до 6, то возвращаемое значение включает в себя долю секунды из этого количества цифр.
mysql> SELECT NOW(); -> '2007-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 20071215235026.000000
Функция NOW()
возвращает постоянное время, указывающее время, в которое оператор начал выполняться. Внутри сохраненной функции или триггера функция NOW()
возвращает время, в которое функция или оператор запуска начали выполняться. Это отличается от поведения функции SYSDATE()
, которая возвращает точное время ее выполнения.
mysql> SELECT NOW(), SLEEP(2), NOW(); -> 2006-04-12 13:47:36, 0, 2006-04-12 13:47:36 mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); -> 2006-04-12 13:47:44, 0, 2006-04-12 13:47:46
Кроме того, инструкция SET TIMESTAMP
влияет на значение, возвращаемое функцией NOW()
, но не функцией SYSDATE()
. Это означает, что настройки отметки времени в двоичном журнале не влияют на вызовы SYSDATE()
. Установка временной метки в ненулевое значение приводит к тому, что каждый последующий вызов NOW()
возвращает это значение. Установка метки времени на ноль отменяет этот эффект, так что NOW()
снова возвращает текущую дату и время.
PERIOD_ADD(P, N)
:MySQL функция PERIOD_ADD()
добавляет N
месяцев к периоду P
(в формате YYMM
или YYYYMM
). Возвращает значение в формате YYYYMM
.
Примечание. Аргумент
P
не является значением даты.
Эта функция возвращает значение NULL
, если P
или N
равно NULL
.
mysql> SELECT PERIOD_ADD(200801,2); -> 200803
PERIOD_DIFF(P1, P2)
:MySQL функция PERIOD_ADD()
возвращает количество месяцев между периодами P1
и P2
. Аргументы P1
и P2
должны быть в формате YYMM
или YYYYMM
. Обратите внимание, что аргументы периода P1
и P2
не являются значениями даты.
Эта функция возвращает значение NULL
, если P1
или P2
равно NULL
.
mysql> SELECT PERIOD_DIFF(200802,200703); -> 11
QUARTER(date)
:MySQL функция QUARTER()
возвращает квартал года для даты date
в диапазоне от 1 до 4 или значение NULL
, если значение date
равно NULL
.
mysql> SELECT QUARTER('2022-04-01'); -> 2
SECOND(time)
:MySQL функция SECOND()
возвращает секунды для времени time
в диапазоне от 0 до 59 или NULL
, если время равно NULL
.
mysql> SELECT SECOND('10:05:03'); -> 3 mysql> SELECT SECOND(NOW()); -> 15
SEC_TO_TIME(seconds)
:MySQL функция SEC_TO_TIME()
возвращает аргумент seconds
, преобразованный в часы, минуты и секунды, в качестве значения TIME
. Диапазон результата ограничен диапазоном типа данных TIME
. Если аргумент находится за пределами этого диапазона то появляется предупреждение.
Функция возвращает значение NULL
, если значение seconds
равно NULL
.
mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
STR_TO_DATE(str, format)
:MySQL функция STR_TO_DATE()
это обратная функция DATE_FORMAT()
. Она принимает строку str
и строку формата format
.
Функция STR_TO_DATE()
возвращает значение:
DATETIME
, если строка формата format
содержит части даты и времени, DATE
или TIME
, если строка str
содержит только части даты или времени. NULL
, то функция возвращает значение NULL
. str
, является недопустимым, то STR_TO_DATE()
возвращает NULL
и выдает предупреждение.Сервер сканирует аргумент str
, пытаясь сопоставить ее формат. Строка формата может содержать буквенные символы и спецификаторы формата, начинающиеся с %
. Буквенные символы в формате должны буквально совпадать в строке str
. Спецификаторы формата в формате должны соответствовать дате или времени в строке str
. Спецификаторы, которые можно использовать в формате, смотрите в описании функции DATE_FORMAT()
.
mysql> SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y'); -> '2013-05-01' mysql> SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y'); -> '2013-05-01'
Сканирование начинается с начала строки str
и завершается ошибкой, если обнаруживается несоответствие формата. Лишние символы в конце строки игнорируются.
mysql> SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s'); -> '09:30:17' mysql> SELECT STR_TO_DATE('a09:30:17','%h:%i:%s'); -> NULL mysql> SELECT STR_TO_DATE('09:30:17a','%h:%i:%s'); -> '09:30:17'
Неуказанные части даты или времени имеют значение 0, поэтому не полностью указанные значения в str
дают результат с некоторыми или всеми частями, установленными в 0:
mysql> SELECT STR_TO_DATE('abc', 'abc'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('9', '%m'); -> '0000-09-00' mysql> SELECT STR_TO_DATE('9', '%s'); -> '00:00:09'
Во время преобразования частей значений даты выполняется проверка диапазона. Это означает, например, что разрешены "нулевые" даты или даты со значениями частей, равными 0, если только режим SQL не настроен на запрет таких значений.
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31'
Если включен SQL-режим NO_ZERO_DATE
, то нулевые даты запрещены. В этом случае STR_TO_DATE()
возвращает NULL
и генерирует предупреждение:
mysql> SET sql_mode = ''; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SET sql_mode = 'NO_ZERO_DATE'; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> NULL mysql> SHOW WARNINGS +---------+------+----------------------------------------+ | Warning | 1411 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+
Примечание. Нельзя использовать формат
'%X%V'
для преобразования строки год-неделя в дату, поскольку комбинация года и недели не идентифицирует однозначно год и месяц, если неделя пересекает границу месяца. Чтобы преобразовать год-неделю в дату, также нужно указать день недели:
mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W'); -> '2004-10-18'
SUBDATE(date, INTERVAL expr unit)
,SUBDATE(expr, days)
:MySQL функция SUBDATE()
с использованием формы передачи аргументов INTERVAL
является синонимом DATE_SUB()
. Для получения информации о единицы измерения unit
смотрите описание для DATE_ADD()
.
mysql> SELECT DATE_SUB('2022-01-02', INTERVAL 31 DAY); -> '2021-12-02' mysql> SELECT SUBDATE('2022-01-02', INTERVAL 31 DAY); -> '2021-12-02'
Вторая форма принимаемых аргументов позволяет использовать целочисленное значение для дней. В таких случаях он интерпретируется как количество дней, которое необходимо вычесть из выражения даты или даты и времени.
mysql> SELECT SUBDATE('2022-01-02 12:00:00', 31); -> '2021-12-02 12:00:00'
Эта функция возвращает значение NULL
, если какой-либо из ее аргументов равен NULL
.
SUBTIME(expr1,expr2)
:MySQL функция SUBTIME()
возвращает expr1
- expr2
, выраженное в виде значения в том же формате, что и expr1
. Аргумент expr1
- это выражение времени или даты, а expr2
- выражение времени.
Разрешение возвращаемого типа этой функции выполняется так же, как и для функции ADDTIME()
;
mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002'); -> '2007-12-30 22:58:58.999997' mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); -> '-00:59:59.999999'
Эта функция возвращает значение NULL
, если значение expr1
или expr2
равно NULL
.
SYSDATE([fsp])
:MySQL функция SYSDATE()
возвращает текущую дату и время в виде значения в формате 'YYYY-MM-DD hh:mm:ss'
или YYYYMMDDhhmmss
, в зависимости от того, используется ли функция в строковом или числовом контексте.
Если задан аргумент fsp
для указания точности в долях секунды от 0 до 6, то возвращаемое значение включает в себя долю секунды из этого числа цифр.
Функция SYSDATE()
возвращает время своего выполнения. Это отличается от поведения функции NOW()
, которая возвращает постоянное время, указывающее время начала выполнения оператора. В пределах хранимой функции или триггера NOW()
возвращает время начала выполнения функции или оператора триггера.
mysql> SELECT NOW(), SLEEP(2), NOW(); -> 2006-04-12 13:47:36, 0, 2006-04-12 13:47:36 mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); -> 2006-04-12 13:47:44, 0, 2006-04-12 13:47:46
Кроме того, инструкция SET TIMESTAMP
влияет на значение, возвращаемое функцией NOW()
, но не функцией SYSDATE()
. Это означает, что настройки отметки времени в двоичном журнале не влияют на вызовы SYSDATE()
.
Поскольку SYSDATE()
может возвращать разные значения даже в одном операторе и на него не влияет SET TIMESTAMP
, она недетерминирована и, следовательно, небезопасна для репликации, если используется двоичное ведение журнала на основе операторов. Если это проблема, то можно использовать ведение журнала на основе строк.
Кроме того, можно использовать опцию CLI --sysdate-is-now
, чтобы SYSDATE()
была псевдонимом для NOW()
. Это работает, если параметр используется как на исходном сервере репликации, так и на реплике.
Недетерминированный характер SYSDATE()
также означает, что для вычисления выражений нельзя использовать индексы, которые на него ссылаются.
TIME(expr)
:MySQL функция TIME()
извлекает временную часть из expr
и возвращает ее в виде строки. Возвращает NULL
, если expr
имеет значение NULL
.
Эта функция небезопасна для репликации на основе операторов. Если используется эта функция, то регистрируется предупреждение, когда для параметра binlog_format
установлено значение STATEMENT
.
mysql> SELECT TIME('2022-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2022-12-31 01:02:03.000123'); -> '01:02:03.000123'
TIMEDIFF(expr1, expr2)
:MySQL функция TIMEDIFF()
возвращает значение expr1
- expr2
, выраженное как значение TIME
. Аргументы expr1
и expr2
являются выражениями TIME
или DATETIME
, но оба должны быть одного типа. Возвращает значение NULL
, если значение expr1
или expr2
равно NULL
.
Результат, возвращаемый TIMEDIFF()
, ограничен диапазоном, разрешенным для значений TIME
. В качестве альтернативы можно использовать любую из функций TIMESTAMPDIFF()
и UNIX_TIMESTAMP()
, обе из которых возвращают целые числа.
mysql> SELECT TIMEDIFF('2000-01-01 00:00:00', -> '2000-01-01 00:00:00.000001'); -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('2022-12-31 23:59:59.000001', -> '2022-12-30 01:01:01.000002'); -> '46:58:57.999999'
TIMESTAMP(expr)
,TIMESTAMP(expr1,expr2)
:MySQL функция TIMESTAMP()
с одним аргументом возвращает выражение DATE
или TIME
аргумента expr
в качестве значения DATETIME
.
Функция TIMESTAMP()
с двумя аргументами добавляет выражение времени expr2
к выражению DATE
или TIME
аргумента expr1
и возвращает результат в виде значения DATETIME
. Возвращает значение NULL
, если значение expr
, expr1
или expr2
равно NULL
.
mysql> SELECT TIMESTAMP('2022-12-31'); -> '2022-12-31 00:00:00' mysql> SELECT TIMESTAMP('2022-12-31 12:00:00', '12:00:00'); -> '2004-01-01 00:00:00'
TIMESTAMPADD(unit, interval, datetime_expr)
:MySQL функция TIMESTAMPADD()
добавляет interval
целочисленного выражения к выражению datetime_expr
даты или даты и времени. Единица измерения интервала задается аргументом unit
, который может принимать одно из следующих значений: MICROSECOND
, SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
или YEAR
.
Эта функция возвращает NULL
, если interval
или datetime_expr
имеет значение NULL
.
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2022-01-02'); -> '2022-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2022-01-02'); -> '2022-01-09'
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
:MySQL функция TIMESTAMPDIFF()
возвращает datetime_expr2
- datetime_expr1
, где datetime_expr1
и datetime_expr2
являются выражениями DATE
или DATETIME
. Одним выражением может быть DATE
, а другим - DATETIME
. Значение DATE
обрабатывается как DATETIME
, имеющее временную часть '00:00:00', где это необходимо. Единица измерения для результата (целое число) задается аргументом unit
. Допустимые значения для единицы измерения совпадают с теми, которые перечислены в описании функции TIMESTAMPADD()
.
Эта функция возвращает значение NULL
, если значение datetime_expr1
или datetime_expr2
равно NULL
mysql> SELECT TIMESTAMPDIFF(MONTH,'2022-02-01','2022-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1 mysql> SELECT TIMESTAMPDIFF(MINUTE,'2022-02-01','2022-05-01 12:05:55'); -> 128885
Примечание. Порядок аргументов даты или даты и времени для этой функции противоположен порядку, используемому с функцией
TIMESTAMP()
при вызове с двумя аргументами.
TIME_FORMAT(time, format)
:MySQL функция TIME_FORMAT()
используется аналогично функции DATE_FORMAT()
, но строка формата может содержать спецификаторы формата только для часов, минут, секунд и микросекунд. Другие спецификаторы выдают NULL
или 0.
TIME_FORMAT()
возвращает NULL
, если время или формат равны NULL
.
Если значение time
содержит часовую часть, превышающую 23, то спецификаторы формата часа %H
и %k
выдают значение, превышающее обычный диапазон от 0 до 23. Другие спецификаторы формата часа производят значение часа по модулю 12.
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
TIME_TO_SEC(time)
:MySQL функция TIME_TO_SEC()
возвращает аргумент time
, преобразованный в секунды. Возвращает NULL
, если time
равно NULL
.
mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
TO_DAYS(date)
:MySQL функция TO_DAYS()
учитывая дату date
, возвращает номер дня (количество дней, прошедших с 0 года). Возвращает значение NULL
, если значение date
равно NULL
.
mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321
Функция TO_DAYS()
не предназначена для использования со значениями, предшествующими появлению григорианского календаря (1582 г.), так как не учитывает дни, потерянные при изменении календаря. Для дат до 1582 года (и, возможно, более позднего года в других регионах) результаты этой функции ненадежны.
Помните, что MySQL преобразует двузначные значения года в даты в четырехзначную форму, используя правила, например, '2022-10-07'
и '22-10-07'
считаются идентичными датами:
mysql> SELECT TO_DAYS('2022-10-07'), TO_DAYS('22-10-07'); -> 738800, 738800
В MySQL нулевая дата определяется как '0000-00-00'
, хотя сама эта дата считается недействительной. Это означает, что для '0000-00-00'
и '0000-01-01'
функция TO_DAYS()
возвращает значения, показанные здесь:
mysql> SELECT TO_DAYS('0000-00-00'); -> NULL mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ mysql> SELECT TO_DAYS('0000-01-01'); -> 1
Это верно независимо от того, включен или нет режим ALLOW_INVALID_DATES
.
TO_SECONDS(expr)
:MySQL функция TO_SECONDS()
при заданном expr
, принимающим DATE
или DATETIME
возвращает количество секунд, прошедших с 0 года. Если выражение не является допустимым значением DATE
или DATETIME
(включая NULL
), возвращается NULL
.
mysql> SELECT TO_SECONDS(950501); -> 62966505600 mysql> SELECT TO_SECONDS('2009-11-29'); -> 63426672000 mysql> SELECT TO_SECONDS('2009-11-29 13:43:32'); -> 63426721412 mysql> SELECT TO_SECONDS( NOW() ); -> 63823909592
Как и TO_DAYS()
, функция TO_SECONDS()
не предназначена для использования со значениями, которые предшествуют появлению григорианского календаря (1582 г.), поскольку она не учитывает дни, которые были потеряны при изменении календаря. Для дат до 1582 года (и, возможно, более позднего года в других регионах) результаты этой функции ненадежны.
Как и TO_DAYS()
, функция TO_SECONDS()
преобразует двузначные значения года в датах в четырехзначную форму с использованием правил.
В MySQL нулевая дата определяется как '0000-00-00'
, хотя сама эта дата считается недействительной. Это означает, что для '0000-00-00'
и '0000-01-01'
функция TO_SECONDS()
возвращает значения, показанные здесь:
mysql> SELECT TO_SECONDS('0000-00-00'); -> NULL mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ mysql> SELECT TO_SECONDS('0000-01-01'); -> 86400
Это верно независимо от того, включен или нет режим ALLOW_INVALID_DATES
.
UNIX_TIMESTAMP([date])
:Если MySQL функция UNIX_TIMESTAMP()
вызывается без аргумента date
, то она возвращает временную метку Unix, представляющую секунды с момента '1970-01-01 00:00:00' UTC.
Если UNIX_TIMESTAMP() вызывается с аргументом date
, то она возвращает значение аргумента в секундах с момента '1970-01-01 00:00:00' UTC. Сервер интерпретирует дату как значение в часовом поясе сеанса и преобразует его во внутреннее значение метки времени Unix в UTC. Аргументом date
может быть строка DATE
, DATETIME
, или TIMESTAMP
или число в формате YYMMDD
, YYMMDDhhmmss
, YYYYMMDD
или YYYYMMDDhhmmss
. Если аргумент включает в себя временную часть, то он может необязательно включать в себя долю секунды.
Возвращаемое значение является целым числом, если аргумент не указан или аргумент не включает доли секунд, или DECIMAL
, если указан аргумент, включающий доли секунд.
Когда аргументом date
является столбец TIMESTAMP
, то UNIX_TIMESTAMP()
возвращает значение внутренней временной метки напрямую, без неявного преобразования строки в временную метку Unix.
До версии MySQL 8.0.28 допустимый диапазон значений аргументов такой же, как и для типа данных TIMESTAMP
: от '1970-01-01 00:00:01.000000'
UTC до '2038-01-19 03:14:07.999999'
UTC. Это также имеет место в MySQL 8.0.28 и более поздних версиях для 32-разрядных платформ. Для MySQL 8.0.28 и более поздних версий, работающих на 64-разрядных платформах, допустимый диапазон значений аргументов для UNIX_TIMESTAMP()
- от '1970-01-01 00:00:01.000000'
UTC до '3001-01-19 03:14:07.999999'
UTC (соответствует 32536771199,999999
секунд).
Независимо от версии MySQL или архитектуры платформы, если передать UNIX_TIMESTAMP()
дату вне допустимого диапазона, она возвращает 0. Если дата равна NULL
, она возвращает NULL
.
mysql> SELECT UNIX_TIMESTAMP(); -> 1447431666 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19'); -> 1447431619 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012'); -> 1447431619.012
Если использовать UNIX_TIMESTAMP()
и FROM_UNIXTIME()
для преобразования между значениями в часовом поясе, отличном от UTC, и значениями временной метки Unix, то преобразование будет с потерями, поскольку сопоставление не является однозначным в обоих направлениях. Например, из-за соглашений об изменении местного часового пояса, таких как переход на летнее время (DST), UNIX_TIMESTAMP()
может сопоставить два значения, которые отличаются в часовом поясе, отличном от UTC, с одним и тем же значением метки времени Unix. Функция FROM_UNIXTIME()
сопоставляет это значение только с одним из исходных значений. Вот пример, в котором используются значения, отличающиеся в часовом поясе MET:
mysql> SET time_zone = 'MET'; mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); -> 1111885200 mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); -> 1111885200 mysql> SELECT FROM_UNIXTIME(1111885200); -> 2005-03-27 03:00:00
Примечание. Чтобы использовать именованные часовые пояса, такие как
'MET'
или'Europe/Moscow'
, необходимо правильно настроить таблицы часовых поясов.
UTC_DATE()
:MySQL функция UTC_DATE()
возвращает текущую дату в формате UTC в виде значения в формате 'YYYY-MM-DD'
или YYYYMMDD
, в зависимости от того, используется ли функция в строковом или числовом контексте.
mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2022-08-14', 20030814
UTC_TIME([fsp])
:MySQL функция UTC_TIME()
возвращает текущее время UTC в виде значения в формате 'hh:mm:ss'
или hhmmss
, в зависимости от того, используется ли функция в строковом или числовом контексте.
Если аргумент fsp
задан для указания точности в дробных секундах от 0 до 6, то возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.
mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753.000000
UTC_TIMESTAMP([fsp])
:Свойство UTC_TIMESTAMP
возвращает текущую дату и время UTC в виде значения в формате 'YYYY-MM-DD hh:mm:ss'
или YYYYMMDDhhmmss
, в зависимости от того, используется ли функция в строковом или числовом контексте.
Если аргумент fsp
задан для указания точности в дробных секундах от 0 до 6, возвращаемое значение включает в себя дробную часть секунды из этого числа цифр.
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2022-08-14 18:08:04', 20030814180804.000000
WEEK(date[, mode])
:MySQL функция WEEK()
возвращает номер недели для даты date
. Форма WEEK()
с двумя аргументами позволяет указать, начинается ли неделя в воскресенье или понедельника и должно ли возвращаемое значение находиться в диапазоне от 0 до 53 или от 1 до 53. Если аргумент mode
опущен, то используется значение системной переменной default_week_format
. Для значения даты NULL
функция возвращает значение NULL
.
В следующей таблице описано, как работает аргумент mode
.
mode | Первый день недели | Диапазон | Что считать первой неделей? |
0 | Воскресенье | 0-53 | 1 неделю с 4 или более дней в этом году |
1 | Понедельник | 0-53 | 1 неделю с 4 или более дней в этом году |
2 | Воскресенье | 1-53 | 1 неделю с воскресеньем в этом году |
3 | Понедельник | 1-53 | 1 неделю с 4 или более дней в этом году |
4 | Воскресенье | 0-53 | 1 неделю с 4 или более дней в этом году |
5 | Понедельник | 0-53 | 1 неделю с понедельником в этом году |
6 | Воскресенье | 1-53 | 1 неделю с 4 или более дней в этом году |
7 | Понедельник | 1-53 | 1 неделю с понедельником в этом году |
Для значений mode
с 4 или более днями в этом году недели нумеруются в соответствии со стандартом ISO 8601:1988:
Если неделя, содержащая 1 января, имеет 4 или более дней в новом году, то это неделя 1.
В противном случае это последняя неделя предыдущего года, а следующая неделя - будет 1 неделя этого года.
mysql> SELECT WEEK('2022-02-20'); -> 8 mysql> SELECT WEEK('2022-02-20',0); -> 8 mysql> SELECT WEEK('2022-02-20',1); -> 7 mysql> SELECT WEEK('2022-12-31',1); -> 52
Если дата приходится на последнюю неделю предыдущего года, то MySQL возвращает 0, если не использовать 2, 3, 6 или 7 в качестве необязательного аргумента mode
:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
Можно возразить, что WEEK()
должна возвращать 52, потому что данная дата фактически приходится на 52-ю неделю 1999 года. Вместо этого WEEK()
возвращает 0, так что возвращаемое значение - это "номер недели в данном году". Это делает использование функции WEEK()
надежным в сочетании с другими функциями, извлекающими часть даты из даты.
Если предпочитаете, чтобы результат вычислялся относительно года, содержащего первый день недели для данной даты, то используйте 0, 2, 5 или 7 в качестве необязательного аргумента mode
.
mysql> SELECT WEEK('2000-01-01',2); -> 52
В качестве альтернативы используйте функцию YEARWEEK()
:
mysql> SELECT YEARWEEK('2000-01-01'); -> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'
WEEKDAY(date)
:MySQL функция WEEKDAY()
возвращает индекс дня недели для даты date
(0 = Monday, 1 = Tuesday, … 6 = Sunday). Возвращает значение NULL
, если значение date
равно NULL
.
mysql> SELECT WEEKDAY('2022-02-03 22:23:00'); -> 2 mysql> SELECT WEEKDAY('2007-11-06'); -> 1
WEEKOFYEAR(date)
:MySQL функция WEEKOFYEAR()
возвращает календарную неделю даты date
в виде числа в диапазоне от 1 до 53. Возвращает NULL
, если date
имеет значение NULL
.
Функция WEEKOFYEAR(date)
эквивалентна WEEK(date, 3)
.
mysql> SELECT WEEKOFYEAR('2022-02-20'); -> 7
YEAR(date)
:MySQL функция YEAR()
возвращает год для переданной date
в диапазоне от 1000 до 9999 или 0 для "нулевой" date
. Возвращает NULL
, если date
равна NULL
.
mysql> SELECT YEAR('1987-01-01'); -> 1987
YEARWEEK(date)
,YEARWEEK(date, mode)
:MySQL функция YEARWEEK()
возвращает год и неделю для аргумента даты date
. Год в результате может отличаться от года в аргументе date
для первой и последней недели года. Возвращает NULL
, если дата равна NULL
.
Аргумент mode
работает точно так же, как аргумент mode
в WEEK()
. Для синтаксиса с одним аргументом, используется mode=0
. В отличие от WEEK()
, значение default_week_format
не влияет на YEARWEEK()
.
mysql> SELECT YEARWEEK('1987-01-01'); -> 198652
Номер недели отличается от того, что функция WEEK()
вернула бы для необязательных аргументов 0 или 1, поскольку WEEK()
затем возвращает неделю в контексте данного года.