Spec-Zone.ru › DuckDB
Функции Timestamp с часовым поясом В этом разделе описаны функции и операторы для проверки и изменения значений TIMESTAMP WITH TIME ZONE (или TIMESTAMPTZ) .
Несмотря на название, эти значения не хранят часовой пояс — только момент времени, как TIMESTAMP. Вместо этого они запрашивают, чтобы момент времени был помещён в ячейку и отформатирован с использованием текущего часового пояса.
Поддержка часовых поясов не встроена, но может быть обеспечена расширением, таким как расширение ICU , поставляемое с DuckDB.
В примерах ниже предполагается, что текущий часовой пояс — America/Los_Angeles по григорианскому календарю.
В таблице ниже показаны доступные скалярные функции для значений TIMESTAMPTZ. Поскольку эти функции не включают группировку или отображение, они всегда доступны.
Описание Текущая дата и время (начало текущей транзакции). Пример current_timestamp Результат 2022-10-08 12:44:46.122-07
Описание Текущая дата и время (начало текущей транзакции). Пример get_current_timestamp() Результат 2022-10-08 12:44:46.122-07
Описание Позже из двух временных меток. Пример greatest(TIMESTAMPTZ '1992-09-20 20:38:48', TIMESTAMPTZ '1992-03-22 01:02:03.1234') Результат 1992-09-20 20:38:48-07
Описание Возвращает true, если метка времени с часовым поясом конечна, иначе — false. Пример isfinite(TIMESTAMPTZ '1992-03-07') Результат true
Описание Возвращает true, если метка времени с часовым поясом бесконечна, иначе — false. Пример isinf(TIMESTAMPTZ '-infinity') Результат true
Описание Раньше из двух временных меток. Пример least(TIMESTAMPTZ '1992-09-20 20:38:48', TIMESTAMPTZ '1992-03-22 01:02:03.1234') Результат 1992-03-22 01:02:03.1234-08
Описание Текущая дата и время (начало текущей транзакции). Пример now() Результат 2022-10-08 12:44:46.122-07
Описание Текущая дата и время (начало текущей транзакции). Пример transaction_timestamp() Результат 2022-10-08 12:44:46.122-07
Без загруженного расширения часового пояса, значения TIMESTAMPTZ будут преобразовываться в строки и обратно с использованием обозначения смещения. Это позволит вам правильно указать момент времени без доступа к информации о часовом поясе. Для обеспечения переносимости значения TIMESTAMPTZ всегда будут отображаться с использованием смещения GMT:
SELECT '2022-10-08 13:13:34-07'::TIMESTAMPTZ; 2022-10-08 20:13:34+00 Если загружено расширение часового пояса, такое как ICU, то часовой пояс может быть проанализирован из строки и преобразован в представление в локальном часовом поясе:
SELECT '2022-10-08 13:13:34 Europe/Amsterdam'::TIMESTAMPTZ::VARCHAR; 2022-10-08 04:13:34-07 -- the offset will differ based on your local time zone В таблице ниже показаны доступные математические операторы для значений TIMESTAMP WITH TIME ZONE, предоставленные расширением ICU.
Оператор Описание Пример Результат + сложение INTERVAL TIMESTAMPTZ '1992-03-22 01:02:03' + INTERVAL 5 DAY 1992-03-27 01:02:03 - вычитание TIMESTAMPTZ TIMESTAMPTZ '1992-03-27' - TIMESTAMPTZ '1992-03-22' 5 days - вычитание INTERVAL TIMESTAMPTZ '1992-03-27 01:02:03' - INTERVAL 5 DAY 1992-03-22 01:02:03
Добавление к бесконечным значениям или вычитание из них приводит к тому же бесконечному значению.
В таблице ниже показаны скалярные функции, предоставленные ICU для значений TIMESTAMP WITH TIME ZONE.
Имя Описание age(timestamptz, timestamptz) Вычитает аргументы, результатом является разница во времени между двумя метками времени. age(timestamptz) Вычитает из текущей даты. date_diff(part, startdate, enddate) Количество границ разбиения разбиения между метками времени. date_part([part, ...], timestamptz) Получить указанные подполя в виде struct. Список должен быть постоянным. date_part(part, timestamptz) Получить подполе (эквивалентно extract ). date_sub(part, startdate, enddate) Количество полных разбиений между метками времени. date_trunc(part, timestamptz) Округлить до указанной точности . datediff(part, startdate, enddate) Псевдоним для date_diff. Количество границ разбиения разбиения между метками времени. datepart([part, ...], timestamptz) Псевдоним для date_part. Получить указанные подполя в виде struct. Список должен быть постоянным. datepart(part, timestamptz) Псевдоним для date_part. Получить подполе (эквивалентно extract ). datesub(part, startdate, enddate) Псевдоним для date_sub. Количество полных разбиений между метками времени. datetrunc(part, timestamptz) Псевдоним для date_trunc. Округлить до указанной точности . epoch_ms(timestamptz) Преобразует timestamptz в миллисекунды с эпохи. epoch_ns(timestamptz) Преобразует timestamptz в наносекунды с эпохи. epoch_us(timestamptz) Преобразует timestamptz в микросекунды с эпохи. extract(field FROM timestamptz) Получить подполе из TIMESTAMP WITH TIME ZONE. last_day(timestamptz) Последний день месяца. make_timestamptz(bigint, bigint, bigint, bigint, bigint, double, string) TIMESTAMP WITH TIME ZONE для заданных частей и часового пояса. make_timestamptz(bigint, bigint, bigint, bigint, bigint, double) TIMESTAMP WITH TIME ZONE для заданных частей в текущем часовом поясе. make_timestamptz(microseconds) TIMESTAMP WITH TIME ZONE для заданных µс с эпохи. strftime(timestamptz, format) Преобразует значение TIMESTAMP WITH TIME ZONE в строку в соответствии со строкой формата . strptime(text, format) Преобразует строку в TIMESTAMP WITH TIME ZONE в соответствии со строкой формата , если %Z указано. time_bucket(bucket_width, timestamptz[, offset]) Округляет timestamptz до указанного интервала bucket_width. Ведра смещены на offset интервал. time_bucket(bucket_width, timestamptz[, origin]) Округляет timestamptz до указанного интервала bucket_width. Ведра выровнены относительно origin timestamptz. origin по умолчанию составляет 2000-01-03 00:00:00+00 для ведер, не включающих интервал месяца или года, и 2000-01-01 00:00:00+00 для ведер месяца и года. time_bucket(bucket_width, timestamptz[, timezone]) Округляет timestamptz до указанного интервала bucket_width. Начало и конец ведра рассчитываются с использованием timezone. timezone — строка и по умолчанию равна UTC.
Описание Вычитает аргументы, результатом является разница во времени между двумя метками времени. Пример age(TIMESTAMPTZ '2001-04-10', TIMESTAMPTZ '1992-09-20') Результат 8 years 6 months 20 days
Описание Вычитает из текущей даты. Пример age(TIMESTAMP '1992-09-20') Результат 29 years 1 month 27 days 12:39:00.844
Описание Количество границ разбиения разбиения между метками времени. Пример date_diff('hour', TIMESTAMPTZ '1992-09-30 23:59:59', TIMESTAMPTZ '1992-10-01 01:58:00') Результат 2
Описание Получить указанные подполя в виде struct. Список должен быть постоянным. Пример date_part(['year', 'month', 'day'], TIMESTAMPTZ '1992-09-20 20:38:40-07') Результат {year: 1992, month: 9, day: 20}
Описание Получить подполе (эквивалентно extract ). Пример date_part('minute', TIMESTAMPTZ '1992-09-20 20:38:40') Результат 38
Описание Количество полных разделов между временными метками. Пример date_sub('hour', TIMESTAMPTZ '1992-09-30 23:59:59', TIMESTAMPTZ '1992-10-01 01:58:00') Результат 1
Описание Округляет до указанной точности . Пример date_trunc('hour', TIMESTAMPTZ '1992-09-20 20:38:40') Результат 1992-09-20 20:00:00
Описание Псевдоним для date_diff. Количество границ разделов между временными метками. Пример datediff('hour', TIMESTAMPTZ '1992-09-30 23:59:59', TIMESTAMPTZ '1992-10-01 01:58:00') Результат 2
Описание Псевдоним для date_part. Получает перечисленные подполя как struct. Список должен быть постоянным. Пример datepart(['year', 'month', 'day'], TIMESTAMPTZ '1992-09-20 20:38:40-07') Результат {year: 1992, month: 9, day: 20}
Описание Псевдоним для date_part. Получает подполе (эквивалентно extract ). Пример datepart('minute', TIMESTAMPTZ '1992-09-20 20:38:40') Результат 38
Описание Псевдоним для date_sub. Количество полных разделов между временными метками. Пример datesub('hour', TIMESTAMPTZ '1992-09-30 23:59:59', TIMESTAMPTZ '1992-10-01 01:58:00') Результат 1
Описание Псевдоним функции date_trunc. Обрезает до указанной точности . Пример datetrunc('hour', TIMESTAMPTZ '1992-09-20 20:38:40') Результат 1992-09-20 20:00:00
Описание Преобразует timestamptz в миллисекунды с момента эпохи. Пример epoch_ms('2022-11-07 08:43:04.123456+00'::TIMESTAMPTZ); Результат 1667810584123
Описание Преобразует timestamptz в наносекунды с момента эпохи. Пример epoch_ns('2022-11-07 08:43:04.123456+00'::TIMESTAMPTZ); Результат 1667810584123456000
Описание Преобразует timestamptz в микросекунды с момента эпохи. Пример epoch_us('2022-11-07 08:43:04.123456+00'::TIMESTAMPTZ); Результат 1667810584123456
Описание Получение подполя из TIMESTAMP WITH TIME ZONE. Пример extract('hour' FROM TIMESTAMPTZ '1992-09-20 20:38:48') Результат 20
Описание Последний день месяца. Пример last_day(TIMESTAMPTZ '1992-03-22 01:02:03.1234') Результат 1992-03-31
Описание TIMESTAMP WITH TIME ZONE для заданных частей и часового пояса. Пример make_timestamptz(1992, 9, 20, 15, 34, 27.123456, 'CET') Результат 1992-09-20 06:34:27.123456-07
Описание TIMESTAMP WITH TIME ZONE для заданных частей в текущем часовом поясе. Пример make_timestamptz(1992, 9, 20, 13, 34, 27.123456) Результат 1992-09-20 13:34:27.123456-07
Описание TIMESTAMP WITH TIME ZONE для заданных мкс с момента эпохи. Пример make_timestamptz(1667810584123456) Результат 2022-11-07 16:43:04.123456-08
Описание Преобразование значения TIMESTAMP WITH TIME ZONE в строку в соответствии со строкой форматирования формата . Пример strftime(timestamptz '1992-01-01 20:38:40', '%a, %-d %B %Y - %I:%M:%S %p') Результат Wed, 1 January 1992 - 08:38:40 PM
Описание Преобразование строки в TIMESTAMP WITH TIME ZONE в соответствии со строкой форматирования формата , если %Z указано. Пример strptime('Wed, 1 January 1992 - 08:38:40 PST', '%a, %-d %B %Y - %H:%M:%S %Z') Результат 1992-01-01 08:38:40-08
Описание Обрезка timestamptz по указанному интервалу bucket_width. Ведра смещены на интервал offset. Пример time_bucket(INTERVAL '10 minutes', TIMESTAMPTZ '1992-04-20 15:26:00-07', INTERVAL '5 minutes') Результат 1992-04-20 15:25:00-07
Описание Обрезка timestamptz по указанному интервалу bucket_width. Ведра выровнены относительно origin timestamptz. origin по умолчанию 2000-01-03 00:00:00+00 для ведер, не включающих интервал месяца или года, и 2000-01-01 00:00:00+00 для ведер месяца и года. Пример time_bucket(INTERVAL '2 weeks', TIMESTAMPTZ '1992-04-20 15:26:00-07', TIMESTAMPTZ '1992-04-01 00:00:00-07') Результат 1992-04-15 00:00:00-07
Описание Обрезка timestamptz по указанному интервалу bucket_width. Начало и конец ведер рассчитываются с использованием timezone. timezone - строка, по умолчанию UTC. Пример time_bucket(INTERVAL '2 days', TIMESTAMPTZ '1992-04-20 15:26:00-07', 'Europe/Berlin') Результат 1992-04-19 15:00:00-07
Также существуют специализированные функции извлечения подполей .
В таблице ниже показаны доступные функции таблиц для типов TIMESTAMP WITH TIME ZONE.
Бесконечные значения не допускаются в качестве границ функций таблиц.
Описание Генерирует таблицу временных меток в замкнутом интервале (включая начальную и конечную временные метки), с шагом интервала. Пример generate_series(TIMESTAMPTZ '2001-04-10', TIMESTAMPTZ '2001-04-11', INTERVAL 30 MINUTE)
Описание Генерирует таблицу временных меток в полуоткрытом интервале (включая начальную временную метку, но не включая конечную), с шагом интервала. Пример range(TIMESTAMPTZ '2001-04-10', TIMESTAMPTZ '2001-04-11', INTERVAL 30 MINUTE)
В таблице ниже показаны предоставляемые ICU скалярные функции, которые работают с обычными TIMESTAMP значениями. Эти функции предполагают, что TIMESTAMP является «локальным временем».
Локальное время фактически представляет собой способ кодирования значений частей из часового пояса в одно значение. Их следует использовать с осторожностью, так как полученные значения могут содержать пробелы и неоднозначности благодаря переходу на летнее время. Часто ту же функциональность можно реализовать более надёжно, используя struct вариант функции date_part.
Имя Описание current_localtime() Возвращает TIME с GMT-биновыми значениями, соответствующими местному времени в текущем часовом поясе. current_localtimestamp() Возвращает TIMESTAMP с GMT-биновыми значениями, соответствующими локальной дате и времени в текущем часовом поясе. localtime Синоним вызова функции current_localtime() . localtimestamp Синоним вызова функции current_localtimestamp() . timezone(text, timestamp) Используйте части даты timestamp в GMT для построения timestamp в заданном часовом поясе. По сути, аргумент — это «локальное» время. timezone(text, timestamptz) Используйте части даты timestamp в заданном часовом поясе для построения timestamp. По сути, результат — «локальное» время.
Описание Возвращает TIME, значения GMT-бинов которого соответствуют местному времени в текущей часовой зоне. Пример current_localtime() Результат 08:47:56.497
Описание Возвращает TIMESTAMP, значения GMT-бинов которого соответствуют местной дате и времени в текущей часовой зоне. Пример current_localtimestamp() Результат 2022-12-17 08:47:56.497
Описание Синоним вызова функции current_localtime(). Пример localtime Результат 08:47:56.497
Описание Синоним вызова функции current_localtimestamp(). Пример localtimestamp Результат 2022-12-17 08:47:56.497
Описание Используйте части даты временной метки в формате GMT для построения временной метки в заданной часовой зоне. По сути, аргумент — это «локальное» время. Пример timezone('America/Denver', TIMESTAMP '2001-02-16 20:38:40') Результат 2001-02-16 19:38:40-08
Описание Используйте части даты временной метки в заданной часовой зоне для построения временной метки. По сути, результат — «локальное» время. Пример timezone('America/Denver', TIMESTAMPTZ '2001-02-16 20:38:40-05') Результат 2001-02-16 18:38:40
Синтаксис AT TIME ZONE — это синтаксический сахар для функции (с двумя аргументами) timezone, перечисленной выше:
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver' AS ts; 2001-02-16 19:38:40-08 SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver' AS ts; 2001-02-16 18:38:40 Обратите внимание, что числовые часовые зоны не допускаются:
SELECT TIMESTAMP '2001-02-16 20:38:40-05' AT TIME ZONE '0200' AS ts; Not implemented Error: Unknown TimeZone '0200' Функции, примененные к бесконечным датам, вернут либо те же бесконечные даты (например, greatest), либо NULL (например, date_part) в зависимости от того, что «имеет смысл». В общем случае, если функция должна проверить части бесконечного временного значения, результатом будет NULL.
Расширение ICU также поддерживает негрегорианские календари . Если такой календарь является текущим, то операции отображения и разбиения на бины будут использовать этот календарь.