Функции и операторы даты и времени#

Эти функции и операторы работают с типами данных даты и времени.

Операторы даты и времени#

Оператор

Пример

Результат

+

date '2012-08-08' + interval '2' day

2012-08-10

+

time '01:00' + interval '3' hour

04:00:00.000

+

timestamp '2012-08-08 01:00' + interval '29' hour

2012-08-09 06:00:00.000

+

timestamp '2012-10-31 01:00' + interval '1' month

2012-11-30 01:00:00.000

+

interval '2' day + interval '3' hour

2 03:00:00.000

+

interval '3' year + interval '5' month

3-5

-

date '2012-08-08' - interval '2' day

2012-08-06

-

time '01:00' - interval '3' hour

22:00:00.000

-

timestamp '2012-08-08 01:00' - interval '29' hour

2012-08-06 20:00:00.000

-

timestamp '2012-10-31 01:00' - interval '1' month

2012-09-30 01:00:00.000

-

interval '2' day - interval '3' hour

1 21:00:00.000

-

interval '3' year - interval '5' month

2-7

Преобразование часового пояса#

Оператор AT TIME ZONE задает часовой пояс для timestamp:

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#

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

current_time#

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

current_timestamp#

Возвращает текущий timestamp с часовым поясом на момент начала выполнения запроса, с 3 знаками дробной части секунды,

current_timestamp(p)

Возвращает текущий timestamp with time zone на момент начала выполнения запроса, с p знаками дробной части секунды:

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

last_day_of_month(x) date#

Возвращает последний день месяца.

from_iso8601_timestamp(string) timestamp(3) with time zone#

Разбирает дату string в формате 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#

Разбирает дату и время string в формате ISO 8601. Часовой пояс по умолчанию берется из часового пояса сессии:

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#

Разбирает дату string в формате ISO 8601 в date. Дата может быть календарной датой, датой недели с использованием ISO-нумерации недель, или комбинацией года и дня года:

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) with time zone, zone) timestamp(p) with time zone#

Преобразует timestamp(p) with time zone в часовой пояс, заданный в zone.

В следующем примере входной часовой пояс - GMT, который в ноябре 2022 года опережает America/Los_Angeles на семь часов:

SELECT at_timezone(TIMESTAMP '2022-11-01 09:08:07.321 GMT', 'America/Los_Angeles')
-- 2022-11-01 02:08:07.321 America/Los_Angeles
with_timezone(timestamp(p), zone) timestamp(p) with time zone#

Возвращает timestamp, указанный в 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#

Возвращает UNIX timestamp unixtime как timestamp с часовым поясом. unixtime - это количество секунд с 1970-01-01 00:00:00 UTC.

from_unixtime(unixtime, zone) timestamp(3) with time zone

Возвращает UNIX timestamp unixtime как timestamp с часовым поясом, используя zone в качестве часового пояса. unixtime - это количество секунд с 1970-01-01 00:00:00 UTC.

from_unixtime(unixtime, hours, minutes) timestamp(3) with time zone

Возвращает UNIX timestamp unixtime как timestamp с часовым поясом, используя hours и minutes как смещение часового пояса. unixtime - это количество секунд с 1970-01-01 00:00:00 в типе данных double.

from_unixtime_nanos(unixtime) timestamp(9) with time zone#

Возвращает UNIX timestamp unixtime как timestamp с часовым поясом. unixtime - это количество наносекунд с 1970-01-01 00:00:00.000000000 UTC:

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
localtime#

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

localtimestamp#

Возвращает текущий timestamp на момент начала выполнения запроса, с 3 знаками дробной части секунды.

localtimestamp(p)

Возвращает текущий timestamp на момент начала выполнения запроса, с 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#

Возвращает day-to-second interval в миллисекундах.

to_unixtime(timestamp) double#

Возвращает timestamp как UNIX timestamp.

Note

Следующие функции стандарта SQL не используют скобки:

  • current_date

  • current_time

  • current_timestamp

  • localtime

  • localtimestamp

Функция усечения#

Функция date_trunc поддерживает следующие единицы:

Единица

Пример усеченного значения

millisecond

2001-08-22 03:04:05.321

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

В приведенных выше примерах в качестве входного значения используется timestamp 2001-08-22 03:04:05.321.

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

Функции интервалов#

Функции в этом разделе поддерживают следующие единицы интервалов:

Единица

Описание

millisecond

Миллисекунды

second

Секунды

minute

Минуты

hour

Часы

day

Дни

week

Недели

month

Месяцы

quarter

Кварталы года

year

Годы

date_add(unit, value, timestamp) [same as input]#

Добавляет interval 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 поддерживает следующие единицы:

Единица

Описание

ns

Наносекунды

us

Микросекунды

ms

Миллисекунды

s

Секунды

m

Минуты

h

Часы

d

Дни

parse_duration(string) interval#

Разбирает string формата value unit в interval, где 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
human_readable_seconds(double) varchar#

Форматирует значение seconds типа double в удобочитаемую строку, содержащую 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

Функции даты MySQL#

Функции в этом разделе используют строку формата, совместимую с функциями MySQL date_parse и str_to_date. Следующая таблица, основанная на руководстве MySQL, описывает спецификаторы формата:

Спецификатор

Описание

%a

Сокращенное название дня недели (Sun .. Sat)

%b

Сокращенное название месяца (Jan .. Dec)

%c

Месяц, числом (1 .. 12), этот спецификатор не поддерживает 0 как месяц.

%D

День месяца с английским суффиксом (0th, 1st, 2nd, 3rd, …)

%d

День месяца, числом (01 .. 31), этот спецификатор не поддерживает 0 как месяц или день.

%e

День месяца, числом (1 .. 31), этот спецификатор не поддерживает 0 как день.

%f

Доля секунды (6 цифр при выводе: 000000 .. 999000; 1 - 9 цифр при разборе: 0 .. 999999999), timestamp усекается до миллисекунд.

%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

Месяц, числом (01 .. 12), этот спецификатор не поддерживает 0 как месяц.

%p

AM или PM

%r

Время суток, 12-часовой формат (эквивалентно %h:%i:%s %p)

%S

Секунды (00 .. 59)

%s

Секунды (00 .. 59)

%T

Время суток, 24-часовой формат (эквивалентно %H:%i:%s)

%U

Неделя (00 .. 53), где воскресенье - первый день недели

%u

Неделя (00 .. 53), где понедельник - первый день недели

%V

Неделя (01 .. 53), где воскресенье - первый день недели; используется с %X

%v

Неделя (01 .. 53), где понедельник - первый день недели; используется с %x

%W

Название дня недели (Sunday .. Saturday)

%w

День недели (0 .. 6), где воскресенье - первый день недели, этот спецификатор не поддерживается, рассмотрите использование day_of_week() (она использует 1-7 вместо 0-6).

%X

Год для недели, где воскресенье - первый день недели, числом, четыре цифры; используется с %V

%x

Год для недели, где понедельник - первый день недели, числом, четыре цифры; используется с %v

%Y

Год, числом, четыре цифры

%y

Год, числом (две цифры); при разборе двухзначный формат года предполагает диапазон 1970 .. 2069, поэтому “70” даст год 1970, а “69” даст 2069.

%%

Буквальный символ %

%x

x, для любого x, не перечисленного выше

Warning

Следующие спецификаторы в настоящее время не поддерживаются: %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) timestamp(3)#

Разбирает string в timestamp с использованием 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#

Разбирает string в timestamp with time zone с использованием format.

Функция извлечения#

Функция extract поддерживает следующие поля:

Поле

Описание

YEAR

year()

QUARTER

quarter()

MONTH

month()

WEEK

week()

DAY

day()

DAY_OF_MONTH

day()

DAY_OF_WEEK

day_of_week()

DOW

day_of_week()

DAY_OF_YEAR

day_of_year()

DOY

day_of_year()

YEAR_OF_WEEK

year_of_week()

YOW

year_of_week()

HOUR

hour()

MINUTE

minute()

SECOND

second()

TIMEZONE_HOUR

timezone_hour()

TIMEZONE_MINUTE

timezone_minute()

Типы, поддерживаемые функцией extract, зависят от извлекаемого поля. Большинство полей поддерживает все типы даты и времени.

extract(field FROM x) bigint#

Возвращает field из x:

SELECT extract(YEAR FROM TIMESTAMP '2022-10-20 05:10:00');
-- 2022

Note

Эта функция стандарта SQL использует специальный синтаксис для указания аргументов.

Удобные функции извлечения#

day(x) bigint#

Возвращает день месяца из x.

day_of_month(x) bigint#

Это псевдоним для day().

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.

week(x) bigint#

Возвращает ISO week года из x. Значение находится в диапазоне от 1 до 53.

week_of_year(x) bigint#

Это псевдоним для week().

year(x) bigint#

Возвращает год из x.

year_of_week(x) bigint#

Возвращает год ISO week из x.

yow(x) bigint#

Это псевдоним для year_of_week().

timezone(timestamp(p) with time zone) varchar#

Возвращает идентификатор часового пояса из timestamp(p) with time zone. Формат возвращаемого идентификатора идентичен формату, используемому во входном timestamp:

SELECT timezone(TIMESTAMP '2024-01-01 12:00:00 Asia/Tokyo'); -- Asia/Tokyo
SELECT timezone(TIMESTAMP '2024-01-01 12:00:00 +01:00'); -- +01:00
SELECT timezone(TIMESTAMP '2024-02-29 12:00:00 UTC'); -- UTC
timezone(time(p) with time zone) varchar

Возвращает идентификатор часового пояса из time(p) with time zone. Формат возвращаемого идентификатора идентичен формату, используемому во входном time:

SELECT timezone(TIME '12:00:00+09:00'); -- +09:00