Функции для работы с датой и временем#
В данном документе приведены функции и операторы, которые работают с типами данных даты и времени.
Операторы#
Оператор |
Пример |
Результат |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Изменение часового пояса#
Оператор AT TIME ZONE
устанавливает часовой пояс.
Поддерживаемые типы данных: TIME, TIME WITH TIME ZONE, TIMESTAMP, TIMESTAMP WITH TIME ZONE.
Смещение часового пояса зависит от даты. Для типов TIMESTAMP
и TIMESTAMP WITH TIME ZONE
смещение будет рассчитано относительно даты, указанной в значении.
Для типов TIME
и TIME
смещение будет рассчитано относительно текущей даты.
Если значение не содержит часовой пояс, то новый часовой пояс будет добавлен к значению без изменения других компонентов времени:
SELECT timestamp '2012-10-31';
-- 2012-10-31 00:00:00.000
SELECT timestamp '2012-10-31' AT TIME ZONE 'America/Los_Angeles';
-- 2012-10-31 00:00:00.000 America/Los_Angeles
SELECT time '01:00';
-- 01:00:00
SELECT time '01:00' AT TIME ZONE 'America/Los_Angeles';
-- 01:00:00 America/Los_Angeles
Если значение содержит часовой пояс, то значения отдельных компонентов времени будет пересчитано в соответствии с новым часовым поясом:
SELECT timestamp '2012-10-31 01:00 UTC';
-- 2012-10-31 01:00:00.000 UTC
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles';
-- 2012-10-30 18:00:00.000 America/Los_Angeles
Общие функции#
- current_date -> date
Возвращает текущую дату на момент начала запроса.
- current_time -> time(3) with timezone
Возвращает текущее время с часовым поясом на момент начала запроса с точностью до секунды.
- current_timestamp -> timestamp(3) with timezone
Возвращает текущую метку времени с часовым поясом на момент начала запроса с точностью до секунды.
- current_timestamp(p) timestamp(p) with timezone
Возвращает текущую метку времени с часовым поясом на момент начала запроса с заданной точностью:
SELECT current_timestamp(6); -- 2020-06-24 08:25:31.759993 America/Los_Angeles
- current_timezone() varchar #
Возвращает текущий часовой пояс в формате IANA (например,
America/Los_Angeles
) или как фиксированное смещение относительно UTC (например,+08:35
).
- date(x) date #
Псевдоним для
CAST(x AS date)
.
- date_trunc(unit, x) [same as input] #
Возвращает метку времени
x
, усеченную до единиц измерения, указанных вunit
:SELECT date_trunc('day' , TIMESTAMP '2022-10-20 05:10:00'); -- 2022-10-20 00:00:00.000 SELECT date_trunc('month' , TIMESTAMP '2022-10-20 05:10:00'); -- 2022-10-01 00:00:00.000 SELECT date_trunc('year', TIMESTAMP '2022-10-20 05:10:00'); -- 2022-01-01 00:00:00.000
Функция
date_trunc
поддерживает следующие единицы измерения:Единица
Пример
millisecond
2001-08-22 03:04:05.000
second
2001-08-22 03:04:05.000
minute
2001-08-22 03:04:00.000
hour
2001-08-22 03:00:00.000
day
2001-08-22 00:00:00.000
week
2001-08-20 00:00:00.000
month
2001-08-01 00:00:00.000
quarter
2001-07-01 00:00:00.000
year
2001-01-01 00:00:00.000
- last_day_of_month(x) date #
Возвращает последний день месяца.
- from_iso8601_timestamp(string) timestamp(3) with time zone #
Преобразует строку в формате ISO 8601 в
timestamp(3) with time zone
. Время по умолчанию равно00:00:00.000
. Часовой пояс по умолчанию равен часовому поясу текущей сессии:SELECT from_iso8601_timestamp('2020-05-11'); -- 2020-05-11 00:00:00.000 America/Vancouver SELECT from_iso8601_timestamp('2020-05-11T11:15:05'); -- 2020-05-11 11:15:05.000 America/Vancouver SELECT from_iso8601_timestamp('2020-05-11T11:15:05.055+01:00'); -- 2020-05-11 11:15:05.055 +01:00
- from_iso8601_timestamp_nanos(string) timestamp(9) with time zone #
Преобразует строку в формате ISO 8601 в
timestamp(9) with time zone
. Время по умолчанию равно00:00:00.000
. Часовой пояс по умолчанию равен часовому поясу текущей сессии:SELECT from_iso8601_timestamp_nanos('2020-05-11T11:15:05'); -- 2020-05-11 11:15:05.000000000 America/Vancouver SELECT from_iso8601_timestamp_nanos('2020-05-11T11:15:05.123456789+01:00'); -- 2020-05-11 11:15:05.123456789 +01:00
- from_iso8601_date(string) date #
Преобразует строку в формате ISO 8601 в
date
. Значением может быть календарная дата, год и неделя, или год и день:SELECT from_iso8601_date('2020-05-11'); -- 2020-05-11 SELECT from_iso8601_date('2020-W10'); -- 2020-03-02 SELECT from_iso8601_date('2020-123'); -- 2020-05-02
- at_timezone(timestamp(p), zone) timestamp(p) with time zone #
Возвращает временную метку, указанную в
timestamp
, с часовым поясом, преобразованным из часового пояса сессии в часовой пояс, указанный вzone
с точностьюp
. В следующем примере часовой пояс сессии установлен наAmerica/New_York
, что на три часа опережает часовой поясAmerica/Los_Angeles
:SELECT current_timezone() -- America/New_York SELECT at_timezone(TIMESTAMP '2022-11-01 09:08:07.321', 'America/Los_Angeles') -- 2022-11-01 06:08:07.321 America/Los_Angeles
- with_timezone(timestamp(p), zone) timestamp(p) with time zone #
Возвращает временную метку
timestamp
к заданному вzone
часовому поясу с точностьюp
:SELECT current_timezone() -- America/New_York SELECT with_timezone(TIMESTAMP '2022-11-01 09:08:07.321', 'America/Los_Angeles') -- 2022-11-01 09:08:07.321 America/Los_Angeles
- from_unixtime(unixtime) timestamp(3) with time zone #
Преобразует количество секунд, прошедших с
1970-01-01 00:00:00 UTC
, указанное вunixtime
, к timestamp(3) with time zone. Результат будет возвращен в часовой зоне текущей сессии.
- from_unixtime(unixtime, zone) timestamp(3) with time zone
Преобразует количество секунд, прошедших с
1970-01-01 00:00:00 UTC
, указанное вunixtime
, к timestamp(3) with time zone. Результат будет возвращен в часовой зонеzone
.
- from_unixtime(unixtime, hours, minutes) timestamp(3) with time zone
Преобразует количество секунд, прошедших с
1970-01-01 00:00:00 UTC
, указанное вunixtime
, к timestamp(3) with time zone. Результат будет возвращен с учетом смещения, заданного вoffset_hours
иoffset_minutes
.
- from_unixtime_nanos(unixtime) timestamp(9) with time zone #
Преобразует количество секунд, прошедших с
1970-01-01 00:00:00 UTC
, указанное вunixtime
, к timestamp(9) with time zone. Результат будет возвращен в часовой зоне текущей сессии:SELECT from_unixtime_nanos(100); -- 1970-01-01 00:00:00.000000100 UTC SELECT from_unixtime_nanos(DECIMAL '1234'); -- 1970-01-01 00:00:00.000001234 UTC SELECT from_unixtime_nanos(DECIMAL '1234.499'); -- 1970-01-01 00:00:00.000001234 UTC SELECT from_unixtime_nanos(DECIMAL '-1234'); -- 1969-12-31 23:59:59.999998766 UTC
- human_readable_seconds(double) varchar #
Преобразует значение
seconds
в текстовую строку, содержащуюweeks
,days
,hours
,minutes
, иseconds
:SELECT human_readable_seconds(96); -- 1 minute, 36 seconds SELECT human_readable_seconds(3762); -- 1 hour, 2 minutes, 42 seconds SELECT human_readable_seconds(56363463); -- 93 weeks, 1 day, 8 hours, 31 minutes, 3 seconds
- localtime -> time(3)
Возвращает текущее время на момент начала запроса.
- localtimestamp -> timestamp(3)
Возвращает текущую временную метку на момент начала запроса.
- localtimestamp(p)
Возвращает текущую временную метку на момент начала запроса с заданной точностью
p
:SELECT localtimestamp(6); -- 2020-06-10 15:55:23.383628
- now() timestamp(3) with time zone #
Псевдоним для
current_timestamp
.
- to_iso8601(x) varchar #
Форматирует
x
как строку ISO 8601. Значениеx
может быть типаdate
,timestamp
илиtimestamp with time zone
.
- to_milliseconds(interval) bigint #
Возвращает
interval day to second
в миллисекундах.
- to_unixtime(timestamp) double #
Возвращает
timestamp
как количество секунд, прошедших с1970-01-01 00:00:00 UTC
.
Примечание
Следующие функции не используют круглые скобки:
current_date
current_time
current_timestamp
localtime
localtimestamp
Интервальные функции#
Функции в этом разделе поддерживают следующие единицы измерения интервала:
Единица |
Описание |
---|---|
|
Миллисекунды |
|
Секунды |
|
Минуты |
|
Часы |
|
Дни |
|
Недели |
|
Месяцы |
|
Кварталы |
|
Годы |
- date_add(unit, value, timestamp) [same as input] #
Добавляет интервал
value
типаunit
кtimestamp
:SELECT date_add('second', 86, TIMESTAMP '2020-03-01 00:00:00'); -- 2020-03-01 00:01:26.000 SELECT date_add('hour', 9, TIMESTAMP '2020-03-01 00:00:00'); -- 2020-03-01 09:00:00.000
Для вычитания передайте отрицательное значение интервала:
SELECT date_add('day', -1, TIMESTAMP '2020-03-01 00:00:00 UTC'); -- 2020-02-29 00:00:00.000 UTC
- date_diff(unit, timestamp1, timestamp2) bigint #
Возвращает
timestamp2 - timestamp1
, выраженный вunit
:SELECT date_diff('second', TIMESTAMP '2020-03-01 00:00:00', TIMESTAMP '2020-03-02 00:00:00'); -- 86400 SELECT date_diff('hour', TIMESTAMP '2020-03-01 00:00:00 UTC', TIMESTAMP '2020-03-02 00:00:00 UTC'); -- 24 SELECT date_diff('day', DATE '2020-03-01', DATE '2020-03-02'); -- 1 SELECT date_diff('second', TIMESTAMP '2020-06-01 12:30:45.000000000', TIMESTAMP '2020-06-02 12:30:45.123456789'); -- 86400 SELECT date_diff('millisecond', TIMESTAMP '2020-06-01 12:30:45.000000000', TIMESTAMP '2020-06-02 12:30:45.123456789'); -- 86400123
- parse_duration(string) interval #
Парсит
string
форматаvalue unit
на интервал, гдеvalue
- это дробное число значенийunit
:SELECT parse_duration('42.8ms'); -- 0 00:00:00.043 SELECT parse_duration('3.81 d'); -- 3 19:26:24.000 SELECT parse_duration('5m'); -- 0 00:05:00.000
Функция
parse_duration
поддерживает следующие единицы измерения:Единица
Описание
ns
Наносекунды
us
Микросекунды
ms
Миллисекунды
s
Секунды
m
Минуты
h
Часы
d
Дни
Форматирование и парсинг (MySQL)#
Функции в этом разделе используют строку формата, совместимую с функциями MySQL date_format
и date_parse
.
Спецификатор |
Описание |
---|---|
|
Сокращенное название дня недели ( |
|
Сокращенное название месяца ( |
|
Месяц, числовой ( |
|
День месяца с английским суффиксом ( |
|
День месяца, числовой ( |
|
День месяца, числовой ( |
|
Доля секунды (1 - 6 цифры для печати: |
|
Час ( |
|
Час ( |
|
Час ( |
|
Минуты, числовой ( |
|
День года ( |
|
Час ( |
|
Час ( |
|
Название месяца ( |
|
Месяц, числовой ( |
|
|
|
Время суток, 12-часовой формат (эквивалентно |
|
Секунды ( |
|
Секунды ( |
|
Время суток, 24-часовой формат (эквивалентно |
|
Неделя ( |
|
Неделя ( |
|
Неделя ( |
|
Неделя ( |
|
Название дня недели ( |
|
День недели ( |
|
Год недели, где воскресенье - первый день недели, числовой, четырехзначный; используется совместно с |
|
Год недели, где понедельник - первый день недели, числовой, четырехзначный; используется совместно с |
|
Год, числовой, четыре цифры |
|
Год, числовой (две цифры); предполагает диапазон |
|
Литеральный символ |
|
|
Предупреждение
Следующие спецификатор в настоящее время не поддерживаются: %D %U %u %V %w %X
- date_format(timestamp, format) varchar #
Форматирует
timestamp
как строку, используяformat
:SELECT date_format(TIMESTAMP '2022-10-20 05:10:00', '%m-%d-%Y %H'); -- 10-20-2022 05
- date_parse(string, format)#
Парсит
string
во временную метку, используяformat
:SELECT date_parse('2022/10/20/05', '%Y/%m/%d/%H'); -- 2022-10-20 05:00:00.000
Форматирование и парсинг (Java)#
Функции в этом разделе используют строку формата, совместимую с форматом DateTimeFormat JodaTime.
- format_datetime(timestamp, format) varchar #
Форматирует
timestamp
как строку, используяformat
.
- parse_datetime(string, format) timestamp with time zone #
Парсит
строку
во временную метку с часовым поясом, используяformat
.
Работа с компонентами временных типов#
- extract(field FROM x) bigint #
Возвращает
field
изx
:SELECT extract(YEAR FROM TIMESTAMP '2022-10-20 05:10:00'); -- 2022
Поддерживаемые поля:
Поле
Описание
YEAR
QUARTER
MONTH
WEEK
DAY
DAY_OF_MONTH
DAY_OF_WEEK
DOW
DAY_OF_YEAR
DOY
YEAR_OF_WEEK
YOW
HOUR
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
Примечание
Эта стандартная функция SQL использует специальный синтаксис для указания аргументов.
- day(x) bigint #
Возвращает день месяца из
x
.
- day_of_week(x) bigint #
Возвращает день недели по стандарту ISO из
x
. Допустимые значения: от1
(понедельник) до7
(воскресенье).
- day_of_year(x) bigint #
Возвращает день года из
x
. Допустимые значения: от1
до366
.
- dow(x) bigint #
Псевдоним для
day_of_week()
.
- doy(x) bigint #
Псевдоним для
day_of_year()
.
- hour(x) bigint #
Возвращает час дня из
x
. Допустимые значения: от0
до23
.
- millisecond(x) bigint #
Возвращает миллисекунды секунды из
x
.
- minute(x) bigint #
Возвращает минуты часа из
x
.
- month(x) bigint #
Возвращает месяц года из
x
.
- quarter(x) bigint #
Возвращает квартал года из
x
. Допустимые значения: от1
до4
.
- second(x) bigint #
Возвращает секунду минуты из
x
.
- timezone_hour(timestamp) bigint #
Возвращает час смещения часового пояса из
timestamp
.
- timezone_minute(timestamp) bigint #
Возвращает минуты смещения часового пояса из
timestamp
.
- year(x) bigint #
Возвращает год из
x
.
- yow(x) bigint #
Псевдоним для
year_of_week()
.