×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

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

2.6.9.1. EXTRACT, date_part
2.6.9.2. date_trunc
2.6.9.3. date_bin
2.6.9.4. AT TIME ZONE и AT LOCAL
2.6.9.5. Текущие дата и время
2.6.9.6. Задержка выполнения

Таблица 2.6.33 в таблице приведены доступные функции для обработки значений даты и времени; подробные сведения представлены в следующих подразделах. Таблица 2.6.32 демонстрирует работу основных арифметических операторов (+, *, и т. д.). Описание функций форматирования приведено в Раздел 2.6.8. Необходимо предварительно ознакомиться со сведениями о типах данных даты и времени в Раздел 2.5.5.

Кроме того, стандартные операторы сравнения, перечисленные в Таблица 2.6.1 доступны для типов данных даты и времени. Значения даты и меток времени (timestamp, с часовым поясом или без него) сопоставимы между собой, в то время как значения времени (time, с часовым поясом или без него) и интервалы (interval) могут сравниваться только со значениями того же типа данных. При сравнении значения типа timestamp without time zone со значением типа timestamp with time zone предполагается, что первое значение задано в часовом поясе, указанном в TimeZone параметре конфигурации, и оно приводится к формату UTC для сравнения со вторым значением (которое уже хранится в формате UTC). Аналогичным образом предполагается, что значение даты соответствует полуночи в TimeZone часовом поясе при сравнении этого значения с типом timestamp.

Все описанные ниже функции и операторы, принимающие в качестве аргументов time или timestamp входные данные фактически представлены в двух вариантах: один из них принимает значение время с часовым поясом или отметка времени с часовым поясом, а другой принимает значение время без часового пояса или отметка времени без часового пояса. Для краткости эти варианты не приводятся по отдельности. Кроме того, многие + и * операторы образуют коммутативные пары (например, оба оператора date + integer и integer + date); в списке представлен только один из каждой такой пары.

Таблица 2.6.32. Операторы даты и времени

Оператор

Описание

Примеры

date + integerdate

Добавление количества дней к дате

date '2001-09-28' + 72001-10-05

date + intervaltimestamp

Добавление интервала к дате

date '2001-09-28' + interval '1 hour'2001-09-28 01:00:00

date + timetimestamp

Добавление времени суток к дате

date '2001-09-28' + time '03:00'2001-09-28 03:00:00

interval + intervalinterval

Сложение интервалов

interval '1 day' + interval '1 hour'1 day 01:00:00

timestamp + intervaltimestamp

Сложение метки времени timestamp с интервалом interval

timestamp '2001-09-28 01:00' + interval '23 hours'2001-09-29 00:00:00

time + intervalвремя

Сложение значения времени time с интервалом interval

time '01:00' + interval '3 hours'04:00:00

- intervalinterval

Унарный минус для интервала interval

- interval '23 hours'-23:00:00

date - dateinteger

Вычитание дат date для получения количества прошедших дней

date '2001-10-01' - date '2001-09-28'3

date - integerdate

Вычитание целого числа дней из даты date

date '2001-10-01' - 72001-09-24

date - intervaltimestamp

Вычитание интервала interval из даты date

date '2001-09-28' - interval '1 hour'2001-09-27 23:00:00

time - timeinterval

Вычитание значений времени time

time '05:00' - time '03:00'02:00:00

time - intervalвремя

Вычитание интервала interval из времени time

time '05:00' - interval '2 hours'03:00:00

timestamp - intervaltimestamp

Вычитание интервала (interval) из временной метки (timestamp)

timestamp '2001-09-28 23:00' - interval '23 hours'2001-09-28 00:00:00

interval - intervalinterval

Вычитание интервалов

interval '1 day' - interval '1 hour'1 day -01:00:00

timestamp - timestampinterval

Вычитание временных меток (с преобразованием 24-часовых интервалов в дни, аналогично функции justify_hours())

timestamp '2001-09-29 03:00' - timestamp '2001-07-27 12:00'63 days 15:00:00

interval * double precisioninterval

Умножение интервала на скалярное значение

interval '1 second' * 90000:15:00

interval '1 day' * 2121 days

interval '1 hour' * 3.503:30:00

interval / double precisioninterval

Деление интервала на скалярное значение

interval '1 hour' / 1.500:40:00


Таблица 2.6.33. Функции даты и времени

Функция

Описание

Примеры

age ( timestamp, timestamp ) → interval

Выполняет вычитание аргументов, формируя «символический» результат, в котором используются значения лет и месяцев вместо только лишь дней

age(timestamp '2001-04-10', timestamp '1957-06-13')43 years 9 mons 27 days

age ( timestamp ) → interval

Вычитает аргумент из текущей даты current_date (в полночь)

age(timestamp '1957-06-13')62 years 6 mons 10 days

clock_timestamp ( ) → timestamp with time zone

Текущие дата и время (значение изменяется в процессе выполнения инструкции); см. Раздел 2.6.9.5

clock_timestamp()2019-12-23 14:39:53.662522-05

current_datedate

Текущая дата; см. Раздел 2.6.9.5

current_date2019-12-23

current_timeвремя с часовым поясом

Текущее время суток; см. Раздел 2.6.9.5

current_time14:39:53.662522-05

current_time ( integer ) → время с часовым поясом

Текущее время суток с ограниченной точностью; см. Раздел 2.6.9.5

current_time(2)14:39:53.66-05

current_timestamptimestamp with time zone

Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5

current_timestamp2019-12-23 14:39:53.662522-05

current_timestamp ( integer ) → timestamp with time zone

Текущие дата и время (момент начала текущей транзакции) с ограниченной точностью; см. Раздел 2.6.9.5

current_timestamp(0)2019-12-23 14:39:53-05

date_add ( timestamp with time zone, interval [, text ] ) → timestamp with time zone

Добавить interval к значению типа timestamp с часовым поясом, при этом время суток и поправки на летнее время вычисляются согласно часовому поясу, указанному в третьем аргументе, или текущему TimeZone значению параметра, если этот аргумент опущен. Вариант синтаксиса с двумя аргументами эквивалентен типу данных timestamp с часовым поясом + interval оператору.

date_add('2021-10-31 00:00:00+02'::timestamptz, '1 day'::interval, 'Europe/Warsaw')2021-10-31 23:00:00+00

date_bin ( interval, timestamp, timestamp ) → timestamp

Группировка входного значения по заданным интервалам с выравниванием по указанному началу отсчета; см. Раздел 2.6.9.3

date_bin('15 minutes', timestamp '2001-02-16 20:38:40', timestamp '2001-02-16 20:05:00')2001-02-16 20:35:00

date_part ( text, timestamp ) → double precision

Получение подполя метки времени (эквивалентно extract); см. Раздел 2.6.9.1

date_part('hour', timestamp '2001-02-16 20:38:40')20

date_part ( text, interval ) → double precision

Получение подполя интервала (эквивалентно функции extract); см. Раздел 2.6.9.1

date_part('month', interval '2 years 3 months')3

date_subtract ( timestamp with time zone, interval [, text ] ) → timestamp with time zone

Вычитает значение типа interval из значения типа значению типа timestamp с часовым поясом, при этом время суток и поправки на летнее время вычисляются согласно часовому поясу, указанному в третьем аргументе, или текущему TimeZone значению параметра, если этот аргумент опущен. Вариант синтаксиса с двумя аргументами эквивалентен типу данных timestamp с часовым поясом - interval оператору.

date_subtract('2021-11-01 00:00:00+01'::timestamptz, '1 day'::interval, 'Europe/Warsaw')2021-10-30 22:00:00+00

date_trunc ( text, timestamp ) → timestamp

Усекает значение до указанной точности; см. подраздел Раздел 2.6.9.2

date_trunc('hour', timestamp '2001-02-16 20:38:40')2001-02-16 20:00:00

date_trunc ( text, timestamp with time zone, text ) → timestamp with time zone

Усекает значение до указанной точности в указанном часовом поясе; см. подраздел Раздел 2.6.9.2

date_trunc('day', timestamptz '2001-02-16 20:38:40+00', 'Australia/Sydney')2001-02-16 13:00:00+00

date_trunc ( text, interval ) → interval

Усекает значение до указанной точности; см. подраздел Раздел 2.6.9.2

date_trunc('hour', interval '2 days 3 hours 40 minutes')2 days 03:00:00

extract ( поле из timestamp ) → numeric

Получение подполя метки времени; см. подраздел Раздел 2.6.9.1

extract(hour from timestamp '2001-02-16 20:38:40')20

extract ( поле из interval ) → numeric

Извлечение части интервала; см. Раздел 2.6.9.1

extract(month from interval '2 years 3 months')3

isfinite ( date ) → boolean

Проверка даты на конечность (отсутствие значения +/-бесконечность)

isfinite(date '2001-02-16')true

isfinite ( timestamp ) → boolean

Проверка метки времени на конечность (отсутствие значения +/-бесконечность)

isfinite(timestamp 'infinity')false

isfinite ( interval ) → boolean

Проверка интервала на конечность (отсутствие значения +/-бесконечность)

isfinite(interval '4 hours')true

justify_days ( interval ) → interval

Корректировка интервала с преобразованием 30-дневных периодов в полные месяцы

justify_days(interval '1 year 65 days')1 year 2 mons 5 days

justify_hours ( interval ) → interval

Корректировка интервала с преобразованием 24-часовых периодов в полные дни

justify_hours(interval '50 hours 10 minutes')2 days 02:10:00

justify_interval ( interval ) → interval

Корректировка интервала с использованием функции justify_days и justify_hours, с учетом знака корректировки

justify_interval(interval '1 mon -1 hour')29 days 23:00:00

localtimeвремя

Текущее время суток; см. Раздел 2.6.9.5

localtime14:39:53.662522

localtime ( integer ) → время

Текущее время суток с ограниченной точностью; см. Раздел 2.6.9.5

localtime(0)14:39:53

localtimestamptimestamp

Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5

localtimestamp2019-12-23 14:39:53.662522

localtimestamp ( integer ) → timestamp

Текущие дата и время (начало текущей транзакции) с ограниченной точностью; см. Раздел 2.6.9.5

localtimestamp(2)2019-12-23 14:39:53.66

make_date ( год int, month int, day int ) → date

Формирование даты на основе полей года, месяца и дня (отрицательные значения года соответствуют годам до н. э.)

make_date(2013, 7, 15)2013-07-15

make_interval ( [ годы int [, месяцы int [, недели int [, дни int [, часы int [, минуты int [, секунды double precision ]]]]]]] ) → interval

Формирует интервал (тип interval) на основе значений лет, месяцев, недель, дней, часов, минут и секунд; для любого из этих полей значением по умолчанию является ноль

make_interval(days => 10)10 days

make_time ( час int, min int, сек double precision ) → время

Формирует значение времени (тип time) на основе значений часа, минуты и секунд

make_time(8, 15, 23.5)08:15:23.5

make_timestamp ( год int, month int, day int, час int, min int, сек double precision ) → timestamp

Формирует метку времени (тип timestamp) на основе значений года, месяца, дня, часа, минуты и секунд (отрицательные значения года соответствуют годам до н. э.)

make_timestamp(2013, 7, 15, 8, 15, 23.5)2013-07-15 08:15:23.5

make_timestamptz ( год int, month int, day int, час int, min int, сек double precision [, часовой пояс text ] ) → timestamp with time zone

Формирует метку времени с часовым поясом (тип timestamp with time zone) на основе значений года, месяца, дня, часа, минуты и секунд (отрицательные значения года соответствуют датам до н. э.). Если часовой пояс не является указан, используется текущий часовой пояс; в примерах предполагается, что часовым поясом сессии является Europe/London

make_timestamptz(2013, 7, 15, 8, 15, 23.5)2013-07-15 08:15:23.5+01

make_timestamptz(2013, 7, 15, 8, 15, 23.5, 'America/New_York')2013-07-15 13:15:23.5+01

now ( ) → timestamp with time zone

Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5

now()2019-12-23 14:39:53.662522-05

statement_timestamp ( ) → timestamp with time zone

Текущие дата и время (момент начала выполнения текущей инструкции); см. Раздел 2.6.9.5

statement_timestamp()2019-12-23 14:39:53.662522-05

timeofday ( ) → text

Текущие дата и время (аналогично функции clock_timestamp, но в виде текстовой text строки); см. Раздел 2.6.9.5

timeofday()Mon Dec 23 14:39:53.662522 2019 EST

transaction_timestamp ( ) → timestamp with time zone

Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5

transaction_timestamp()2019-12-23 14:39:53.662522-05

to_timestamp ( double precision ) → timestamp with time zone

Преобразование значения Unix-эпохи (количество секунд, прошедших с 1970-01-01 00:00:00+00) в timestamp with time zone

to_timestamp(1284352323)2010-09-13 04:32:03+00


В дополнение к этим функциям язык SQL OVERLAPS поддерживается оператор:

(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

Данное выражение возвращает логическое значение true, если два периода времени, определенные их граничными точками, перекрываются, и false, если перекрытия нет. Граничные точки могут быть указаны в виде пар дат, значений времени или меток времени; либо как дата, время или метка времени с последующим интервалом (interval). Если указана пара значений, первым может быть записано как начало, так и конец периода; OVERLAPS язык SQL автоматически выбирает меньшее значение из пары в качестве начала периода. Каждый период времени рассматривается как представляющий собой полуоткрытый интервал start <= время < end, за исключением случаев, когда start и end равны; в этой ситуации он представляет собой один этот момент времени. Это означает, например, что два временных периода, имеющие только одну общую конечную точку, не перекрываются.

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Результат: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Результат: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Результат: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Результат: true

При прибавлении значения типа interval к значению типа (или вычитании значения типа interval из значения типа) timestamp или timestamp with time zone значения, поля месяцев, дней и микросекунд interval значения обрабатываются последовательно. Сначала на основании ненулевого значения поля месяцев дата временной метки увеличивается или уменьшается на указанное количество месяцев. При этом число месяца сохраняется, если оно не превышает количество дней в новом месяце; в противном случае результатом будет последний день данного месяца. (Например, при добавлении 1 месяца к 31 марта получается 30 апреля, а при добавлении 2 месяцев к 31 марта — 31 мая.) Затем на основании значения поля дней дата временной метки увеличивается или уменьшается на указанное количество дней. На обоих этих этапах локальное время суток остается неизменным. Наконец, если поле микросекунд содержит ненулевое значение, оно прибавляется или вычитается без изменений. При выполнении арифметических операций над timestamp with time zone значением в часовом поясе с поддержкой перехода на летнее время (DST), это означает, что прибавление или вычитание (например) интервала '1 day' не обязательно приводит к тому же результату, что и прибавление или вычитание interval '24 hours'. Например, если для часового пояса сеанса установлено значение America/Denver:

SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '1 day';
Результат: 2005-04-03 12:00:00-06
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '24 hours';
Результат: 2005-04-03 13:00:00-06

Это происходит по причине того, что один час был пропущен вследствие перехода на летнее время в 2005-04-03 02:00:00 в часовом поясе America/Denver.

Следует учитывать возможную неоднозначность в месяцы поле, возвращаемом функцией age так как различные месяцы имеют разное количество дней. Digital Q.DataBaseАлгоритм использует месяц из более ранней из двух дат при вычислении неполных месяцев. Например, age('2004-06-01', '2004-04-30') использует апрель, что дает результат 1 mon 1 day, тогда как использование мая дало бы результат 1 mon 2 days поскольку в мае 31 день, тогда как в апреле — только 30.

Операция вычитания дат и меток времени также может быть сложной. Одним из концептуально простых способов выполнения вычитания является преобразование каждого значения в количество секунд с помощью функции EXTRACT(EPOCH FROM ...), с последующим вычитанием полученных результатов; данная операция вычисляет количество секунд между двумя значениями. При таком подходе учитывается количество дней в каждом месяце, смещение часовых поясов и переход на летнее время. Вычитание значений типов date или timestamp при помощи «-» оператора - возвращает количество дней (кратных 24 часам), а также часов, минут и секунд между значениями с учетом аналогичных корректировок. Функция age возвращает разницу в годах, месяцах, днях, часах, минутах и секундах, выполняя вычитание по каждому полю отдельно с последующей корректировкой отрицательных значений. Различия между этими подходами иллюстрируют следующие запросы. Приведенные примеры результатов были получены при следующих настройках: timezone = 'US/Eastern'; между двумя используемыми датами происходит переход на летнее время:

SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
       EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
Результат: 10537200.000000
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
        EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
        / 60 / 60 / 24;
Результат: 121.9583333333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
Результат: 121 день 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
Результат: 4 месяца

2.6.9.1. EXTRACT, date_part #

EXTRACT(field FROM source)

Данный extract функция позволяет извлекать такие поля, как год или час, из значений даты и времени. source должно быть выражением значения типа timestamp, date, time, или interval. (Значения типов timestamp и time могут быть как с часовым поясом, так и без него.) field представляет собой идентификатор или строку, определяющую поле для извлечения из исходного значения. Не все поля допустимы для каждого входного типа данных; например, поля меньше суток нельзя извлечь из типа date, тогда как поля размером в сутки и более нельзя извлечь из типа time. Данная функция extract возвращает значения типа numeric.

Допустимыми именами полей являются:

century

Век; для interval значений поле года делится на 100

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
Результат: 20
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 21
SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD');
Результат: 1
SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC');
Результат: -1
SELECT EXTRACT(CENTURY FROM INTERVAL '2001 years');
Результат: 20
day

День месяца (от 1 до 31); для interval значений — количество дней

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 16
SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
Результат: 40
decade

Значение поля года, делённое на 10

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 200
dow

День недели, где воскресенью соответствует значение (0) к Суббота (6)

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 5

Обратите внимание, что extractнумерация дней недели отличается от аналогичного значения в to_char(..., 'D') функции.

doy

День года (1–365/366)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 47
epoch

Для timestamp with time zone значений, количество секунд, прошедших с 1970-01-01 00:00:00 UTC (отрицательное значение для меток времени, предшествующих этой дате); в date и timestamp значений, номинальное количество секунд, прошедших с 1970-01-01 00:00:00, без учета часового пояса и правил перехода на летнее время; в interval значений, общее количество количество секунд в интервале

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Результат: 982384720.120000
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12');
Результат: 982355920.120000
SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Результат: 442800.000000

Значение epoch можно преобразовать обратно в timestamp with time zone с to_timestamp:

SELECT to_timestamp(982384720.12);
Результат: 2001-02-17 04:38:40.12+00

Следует учитывать, что применение функции to_timestamp к значению epoch, извлеченному из типа date или timestamp timestamp, может привести к некорректному результату: фактически будет предполагаться, что исходное значение было задано в UTC, что может не соответствовать действительности.

час

Поле часа (0–23 для меток времени, не ограничено для интервалов)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 20
isodow

День недели, где понедельник (1) к Воскресенье (7)

SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
Результат: 7

Это значение идентично результату dow за исключением воскресенья. Здесь используется соответствует ISO нумерация дней недели согласно стандарту ISO 8601.

isoyear

Данный ISO год согласно системе нумерации недель ISO 8601, к которому относится указанная дата

SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
Результат: 2005
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
Результат: 2006

Каждый ISO год согласно системе нумерации недель ISO 8601 начинается с понедельника той недели, на которую приходится 4 января. По этой причине в начале января или в конце декабря номер ISO года ISO может отличаться от номера года по григорианскому календарю. Дополнительную информацию см. в описании поля week field for more information.

julian

Данный Юлианская дата соответствующий дате или метке времени. Метки времени не соответствующие местной полночи, дают в результате дробное значение. См. Раздел 8.2.7 для получения дополнительной информации.

SELECT EXTRACT(JULIAN FROM DATE '2006-01-01');
Результат: 2453737
SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00');
Результат: 2453737.50000000000000000000
микросекунды

Значение поля секунд, включая дробную часть, умноженное на 1 000 000; обратите внимание, что оно включает полные секунды

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Результат: 28500000
тысячелетие

Тысячелетие; для interval значений поле года деленное на 1000

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 3
SELECT EXTRACT(MILLENNIUM FROM INTERVAL '2001 years');
Результат: 2

Годы в диапазоне 1900-х относятся ко второму тысячелетию. Третье тысячелетие началось 1 января 2001 года.

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

Значение поля секунд, включая дробную часть, умноженное на 1000. Обратите внимание, что это значение включает полные секунды.

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Результат: 28500.000
минута

Значение поля минут (0–59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 38
month

Номер месяца в пределах года (1–12); в interval значений, количество месяцев по модулю 12 (0–11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 2
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Результат: 3
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Результат: 1
квартал

Квартал года (1–4), к которому относится указанная дата

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 1
second

Поле секунд, включая дробную часть секунд

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 40.000000
SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Результат: 28.500000
часовой пояс

Смещение часового пояса относительно UTC в секундах. Положительные значения соответствуют часовым поясам к востоку от UTC, а отрицательные — к западу от UTC. (Технически, Digital Q.DataBase не использует UTC, так как високосные секунды не поддерживаются.)

timezone_hour

Часовой компонент смещения часового пояса

timezone_minute

Минутный компонент смещения часового пояса

week

Номер ISO недели года согласно стандарту ISO 8601 года. По определению, недели ISO начинаются с понедельника, а первая неделя года включает в себя 4 января. Иными словами, первый четверг года всегда входит в неделю 1.

В системе нумерации недель ISO дни начала января могут относиться даты относятся к 52-й или 53-й неделе предыдущего года, а даты в конце декабря могут относиться к первой неделе следующего года. Например, 2005-01-01 относится к 53-й неделе 2004 года, а 2006-01-01 относится к 52-й неделе 2005 года, тогда как 2012-12-31 относится к первой неделе 2013 года. Для получения согласованных результатов рекомендуется использовать isoyear поле вместе с полем week to get consistent results.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 7
год

Поле YEAR (год). Необходимо учитывать, что года 0 ADне существует, поэтому операцию вычитания BC лет из значения AD лет следует выполнять с осторожностью.

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001

При обработке значения interval , функция extract формирует значения полей, соответствующие интерпретации, которая используется функцией вывода интервалов (interval output function). Это может привести к неожиданным результатам, если в качестве исходного используется ненормализованное представление интервала, например:

SELECT INTERVAL '80 minutes';
Результат: 01:20:00
SELECT EXTRACT(MINUTES FROM INTERVAL '80 minutes');
Результат: 20

Примечание

Если входное значение равно +/-Infinity, extract возвращает +/-Infinity для монотонно возрастающих полей (epoch, julian, год, isoyear, decade, century, и тысячелетие для timestamp входных данных; epoch, час, day, год, decade, century, и тысячелетие для interval входных данных). Для остальных полей возвращается значение NULL. Digital Q.DataBase в версиях до 9.6 во всех случаях бесконечных входных данных возвращалось значение ноль.

Данный extract функция в первую очередь предназначена для вычислительной обработки данных. Сведения о форматировании значений даты и времени для отображения приведены в описании Раздел 2.6.8.

Данный date_part функция реализована по образцу традиционной функции Ingres эквивалентна функции SQL-стандартная функция extract:

date_part('field', source)

Обратите внимание, что в данном случае field параметр должен представлять собой строковое значение, а не имя. Допустимые имена полей для функции date_part совпадают с именами полей для функции extract. По историческим причинам функция date_part данная функция возвращает значения типа double precision. В определенных сценариях использования это может привести к потере точности. Вместо этого использование функции extract рекомендуется в качестве альтернативы.

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Результат: 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Результат: 4

2.6.9.2. date_trunc #

Функция date_trunc концептуально сходна с trunc функцией для числовых значений.

date_trunc(field, source [, time_zone ])

source представляет собой выражение, имеющее значение типа timestamp, timestamp with time zone, или interval. (Значения типа date и time автоматически приводятся к типу timestamp или interval, соответственно). field определяет точность, с которой будет выполнено усечение входного значения. Возвращаемое значение также относится к типу timestamp, timestamp with time zone, или interval, при этом для всех полей, менее значимых, чем выбранное, устанавливается значение ноль (или единица для дня и месяца).

Допустимыми значениями для field являются:

microseconds
milliseconds
second
minute
hour
day
week
month
quarter
year
decade
century
millennium

Если входное значение имеет тип timestamp with time zone, усечение выполняется с учетом конкретного часового пояса; например, усечение до day возвращает значение, соответствующее полночи в данном поясе. По умолчанию усечение выполняется относительно текущей настройки TimeZone , однако может быть указан необязательный аргумент time_zone для указания другого часового пояса может быть передан дополнительный аргумент. Название часового пояса может быть задано любым из способов, описанных в Раздел 2.5.5.3.

Указание часового пояса недопустимо при обработке timestamp without time zone или interval входных данных. Эти значения всегда обрабатываются в исходном виде.

Примеры (при условии, что локальный часовой пояс — America/New_York):

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001-01-01 00:00:00
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00');
Результат: 2001-02-16 00:00:00-05
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00', 'Australia/Sydney');
Результат: 2001-02-16 08:00:00-05
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');
Результат: 3 days 02:00:00

2.6.9.3. date_bin #

Функция date_bin «группирует по интервалам» входное значение типа timestamp по заданному интервалу ( шаг) с выравниванием по заданному началу отсчета.

date_bin(шаг, source, начало отсчета)

source представляет собой выражение, имеющее значение типа timestamp или timestamp with time zone. (Значения типа date автоматически приводятся к типу timestamp.) шаг представляет собой выражение значения типа interval. Возвращаемое значение также имеет тип timestamp или timestamp with time zone, и оно определяет начало интервала, в который source помещается значение.

Примеры:

SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01');
Результат: 2020-02-11 15:30:00
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01 00:02:30');
Результат: 2020-02-11 15:32:30

В случае использования полных единиц (1 минута, 1 час и т. д.) результат будет таким же, как и при аналогичном date_trunc вызове, однако различие заключается в том, что date_bin позволяет выполнять усечение до произвольного интервала.

Данный шаг интервал должен быть больше нуля и не может содержать единицы измерения «месяц» или более крупные.

2.6.9.4. AT TIME ZONE и AT LOCAL #

Данный AT TIME ZONE оператор преобразует метку времени без часового пояса в метку времени или из метки времени с часовым поясом, и время с часовым поясом значения для различных часовых поясов. Таблица 2.6.34 показывает доступные варианты.

Таблица 2.6.34. AT TIME ZONE и AT LOCAL Варианты

Оператор

Описание

Примеры

отметка времени без часового пояса AT TIME ZONE поясомtimestamp with time zone

Преобразует заданную метку времени без часового пояса в метку времени с часового пояса, принимая, что данное значение относится к указанному часовому поясу.

timestamp '2001-02-16 20:38:40' at time zone 'America/Denver'2001-02-17 03:38:40+00

отметка времени без часового пояса AT LOCALtimestamp with time zone

Преобразует заданную метку времени без часового пояса в метку времени с текущего сеанса TimeZone значение в качестве часового пояса.

timestamp '2001-02-16 20:38:40' at local2001-02-17 03:38:40+00

timestamp with time zone AT TIME ZONE поясомотметка времени без часового пояса

Преобразует заданную метку времени с часового пояса в метку времени без часовой пояс в том виде, в каком время отображалось бы в этом поясе.

timestamp with time zone '2001-02-16 20:38:40-05' at time zone 'America/Denver'2001-02-16 18:38:40

timestamp with time zone AT LOCALотметка времени без часового пояса

Преобразует заданную метку времени с часового пояса в метку времени без часовой пояс в том виде, в каком время отображаться с настройками текущего сеанса TimeZone значение в качестве часового пояса.

timestamp with time zone '2001-02-16 20:38:40-05' at local2001-02-16 18:38:40

время с часовым поясом AT TIME ZONE поясомвремя с часовым поясом

Данное выражение преобразует заданное значение времени с из одного часового пояса в новое значение времени в другом часовом поясе. Так как дата не указана, используется смещение относительно UTC, актуальное на текущий момент для указанного целевого часового пояса.

time with time zone '05:34:17-05' at time zone 'UTC'10:34:17+00

время с часовым поясом AT LOCALвремя с часовым поясом

Данное выражение преобразует заданное значение времени с из одного часового пояса в новое значение времени в другом часовом поясе. Так как дата не указана, используется смещение относительно UTC, актуальное на текущий момент смещение для текущего сеанса, TimeZone соответствующее значению.

При условии, что для текущего сеанса TimeZone установлено значение UTC:

time with time zone '05:34:17-05' at local10:34:17+00


В этих выражениях требуемый часовой пояс поясом может быть указан либо в виде текстового значения (например, 'America/Los_Angeles'), либо в виде интервала (например, INTERVAL '-08:00'). В случае текстового аргумента имя часового пояса может быть указано любым из способов, описанных в Раздел 2.5.5.3. Использование интервала применимо только для часовых поясов с фиксированным смещением относительно UTC, поэтому на практике такой вариант встречается редко.

Синтаксическая конструкция AT LOCAL может использоваться как сокращенная форма AT TIME ZONE local, где local представляет собой значение сеанса для TimeZone значении.

Примеры (при условии, что текущая TimeZone настройка установлена в America/Los_Angeles):

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver';
Результат: 2001-02-16 19:38:40-08
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver';
Результат: 2001-02-16 18:38:40
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago';
Результат: 2001-02-16 05:38:40
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT LOCAL;
Результат: 2001-02-16 17:38:40
SELECT TIME WITH TIME ZONE '20:38:40-05' AT LOCAL;
Результат: 17:38:40

В первом примере часовой пояс добавляется к значению, в котором он отсутствует, а полученный результат отображается с использованием текущей TimeZone настройки. Во втором примере значение типа timestamp with time zone смещается в указанный часовой пояс, после чего возвращается значение без часового пояса. Это позволяет хранить и отображать значения, отличные от установленных текущей TimeZone настройки. В третьем примере время Токио преобразуется во время Чикаго. В четвертом примере значение типа timestamp with time zone смещается в часовой пояс, заданный в данный момент TimeZone настройкой, и возвращается значение без часового пояса.

Пятый пример служит предостережением. В связи с тем, что с входным значением не связана конкретная дата, преобразование выполняется с использованием текущей даты сеанса. Следовательно, этот статический пример может выводить неверный результат в зависимости от времени года, в которое он просматривается, так как 'America/Los_Angeles' использует переход на летнее время.

Функция часовой пояс(поясом, timestamp) эквивалентно конструкции, соответствующей стандарту SQL timestamp AT TIME ZONE поясом.

Функция часовой пояс(поясом, время) эквивалентно конструкции, соответствующей стандарту SQL время AT TIME ZONE поясом.

Функция часовой пояс(timestamp) эквивалентно конструкции, соответствующей стандарту SQL timestamp AT LOCAL.

Функция часовой пояс(время) эквивалентно конструкции, соответствующей стандарту SQL время AT LOCAL.

2.6.9.5. Текущие дата и время #

Digital Q.DataBase предоставляет ряд функций, возвращающих значения, связанные с текущей датой и временем. Все эти функции стандарта SQL возвращают значения, основанные на времени начала текущей транзакции:

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(точность)
CURRENT_TIMESTAMP(точность)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(точность)
LOCALTIMESTAMP(точность)

CURRENT_TIME и CURRENT_TIMESTAMP возвращают значения с часовым поясом; LOCALTIME и LOCALTIMESTAMP возвращают значения без часового пояса.

CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, а LOCALTIMESTAMP может принимать необязательный параметр точности, согласно которому результат округляется до соответствующего количества знаков после запятой в поле секунд. При отсутствии параметра точности результат возвращается с максимально доступной точностью.

Некоторые примеры:

SELECT CURRENT_TIME;
Результат: 14:39:53.662522-05
SELECT CURRENT_DATE;
Результат: 2019-12-23
SELECT CURRENT_TIMESTAMP;
Результат: 2019-12-23 14:39:53.662522-05
SELECT CURRENT_TIMESTAMP(2);
Результат: 2019-12-23 14:39:53.66-05
SELECT LOCALTIMESTAMP;
Результат: 2019-12-23 14:39:53.662522

Поскольку данные функции возвращают время начала текущей транзакции, их значения не изменяются в ходе выполнения транзакции. Данное поведение считается функциональной особенностью: оно обеспечивает согласованное представление времени в рамках одной транзакции, «текущее значение» благодаря чему несколько изменений в одной и той же транзакции получают идентичную метку времени.

Примечание

В других системах управления базами данных данные значения могут обновляться чаще.

Digital Q.DataBase также предусмотрены функции, возвращающие время начала выполнения текущего оператора, а также фактическое текущее время в момент вызова функции. Полный список функций времени, не входящих в стандарт SQL, включает:

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()

transaction_timestamp() эквивалентен конструкции CURRENT_TIMESTAMP, однако её название более точно отражает возвращаемый результат. statement_timestamp() возвращает время начала выполнения текущей инструкции (более точно — время получения последнего сообщения с командой от клиентской части). statement_timestamp() и transaction_timestamp() возвращают одинаковое значение в процессе выполнения первой команды транзакции, но могут различаться при выполнении последующих команд. clock_timestamp() возвращает фактическое текущее время, и следовательно, её значение изменяется даже в рамках выполнения одной команды языка SQL. timeofday() является устаревшей Digital Q.DataBase функцией. Как и функция clock_timestamp(), она возвращает фактическое текущее время, но в виде отформатированной text строки, а не timestamp with time zone value. now() является традиционным Digital Q.DataBase эквивалентом функции transaction_timestamp().

Все типы данных даты и времени также принимают специальное литеральное значение now для указания текущей даты и времени (которое также интерпретируется как время начала транзакции). Таким образом, следующие три выражения возвращают один и тот же результат:

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now';  -- но см. примечание ниже

Подсказка

Не используйте третью форму при указании значения, которое должно быть вычислено позже, например, в DEFAULT предложении для столбца таблицы. Система преобразует now в timestamp сразу после разбора константы, поэтому в тот момент, когда потребуется значение по умолчанию, будет использовано время создания таблицы! Первые две формы не будут вычисляться до момента использования значения по умолчанию, поскольку они представляют собой вызовы функций. Таким образом, они обеспечат требуемое поведение: подстановку времени вставки строки в качестве значения по умолчанию. (См. также раздел Раздел 2.5.5.1.4.)

2.6.9.6. Задержка выполнения #

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

pg_sleep ( double precision )
pg_sleep_for ( interval )
pg_sleep_until ( timestamp with time zone )

pg_sleep переводит процесс текущего сеанса в состояние ожидания до тех пор, пока не истечет указанное количество секунд. Допускается указание задержек с дробными долями секунды. pg_sleep_for является вспомогательной функцией, позволяющей задавать время задержки в формате interval. pg_sleep_until является вспомогательной функцией для тех случаев, когда необходимо задать конкретное время возобновления работы. Например:

SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');

Примечание

Фактическая точность интервала задержки зависит от платформы; типичное значение составляет 0.01 секунды. Фактическая задержка будет как минимум не меньше указанной. Этот интервал может быть увеличен в зависимости от таких факторов, как нагрузка на сервер. В частности, pg_sleep_until не гарантирует возобновление работы точно в указанное время, однако оно не произойдет раньше заданного момента.

Предупреждение

При вызове функции убедитесь, что в текущем сеансе не удерживается больше блокировок, чем необходимо, pg_sleep или её вариантов. В противном случае другим сеансам может потребоваться ожидание завершения спящего процесса, что приведет к замедлению работы всей системы.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению