Типы даты/времени

QHB поддерживает полный набор типов даты и времени SQL, приведенных в Таблице 9. Операции, доступные для этих типов данных, описаны в разделе Функции и операторы даты/времени. Даты подсчитываются в соответствии с григорианским календарем, даже для времени до его введения (дополнительную информацию см. в разделе История единиц измерения времени).

Таблица 9. Типы даты/времени

ИмяРазмерОписаниеНаименьшее значениеНаибольшее значениеТочность
timestamp [ (p) ] [ without time zone ]8 байтдата и время (без часового пояса)4713 г. до н. э.294276 г. н. э.1 микросекунда
timestamp [ (p) ] with time zone8 байтдата и время с часовым поясом4713 г. до н. э.294276 г. н.э.1 микросекунда
date4 байтадата (без времени суток)4713 г. до н. э.5874897 г. н. э.1 день
time [ (p**) ] [ without time zone ]8 байтвремя суток (без даты)00:00:0024:00:001 микросекунда
time [ (p) ] with time zone12 байтвремя суток (без даты) с часовым поясом00: 00: 00+145924: 00: 00-14591 микросекунда
interval [ поля ] [ (p) ]16 байтинтервал времени-178000000 лет178000000 лет1 микросекунда

Примечание
Стандарт SQL требует, чтобы только запись timestamp была равнозначна timestamp without time zone, и QHB следует этой логике. timestamptz принимается как сокращение от timestamp with time zone; это расширение QHB.

Типы time, timestamp и interval принимают необязательное значение точности p, которое указывает, сколько знаков после запятой должно сохраняться в поле секунд. По умолчанию явное ограничение отсутствует. Допустимый диапазон p — от 0 до 6.

Тип interval имеет дополнительный параметр, позволяющий ограничить набор хранимых полей путем записи одной из этих фраз:

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND

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

Тип time with time zone определяется стандартом SQL, но в определении описаны свойства сомнительной полезности. В большинстве случаев сочетание date, time, timestamp without time zone и timestamp with time zone должно обеспечивать полный диапазон функциональности даты/времени, требуемой для любого приложения.



Ввод даты/времени

Ввод даты и времени допускается практически в любом приемлемом формате, включая ISO 8601, SQL-совместимый, традиционный формат POSTGRES и другие. Для некоторых форматов порядок дня, месяца и года в вводимой дате является неоднозначным, поэтому поддерживается явное указание ожидаемого порядка этих полей. Установите для параметра DateStyle значение MDY для выбора интерпретации месяц-день-год, DMY для день-месяц-год или YMD для год-месяц-день.

QHB более гибка в обработке ввода даты/времени, чем требует стандарт SQL. В главе Поддержка даты и времени приведены точные правила синтаксического анализа вводимых даты/времени и распознаваемых текстовых полей, включая месяцы, дни недели и часовые пояса.

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

тип [ (p) ] 'значение'

где p — необязательное указание точности, задающее количество знаков после запятой в поле секунд. Точность можно указать для типов time, timestamp и interval в диапазоне от 0 до 6. Если в определении константы точность не указана, то по умолчанию используется точность литерального значения (но не более 6 цифр).


Даты

В Таблице 10 приведены некоторые возможные входные данные для типа date.

Таблица 10. Ввод даты

ПримерОписание
1999-01-08ISO 8601; 8 января в любом режиме (рекомендуемый формат)
January 8, 1999определяется однозначно в любом режиме ввода datestyle
1/8/19998 января в режиме MDY; 1 августа в режиме DMY
1/18/199918 января в режиме MDY; недопустимая дата в других режимах
01/02/032 января 2003 г. в режиме MDY; 1 февраля 2003 г. в режиме DMY; 3 февраля 2001 г. в режиме YMD
1999-Jan-088 января в любом режиме
Jan-08-19998 января в любом режиме
08-Jan-19998 января в любом режиме
99-Jan-088 января в режиме YMD; ошибка в других режимах
08-Jan-998 января; ошибка в режиме YMD
Jan-08-998 января; ошибка в режиме YMD
19990108ISO 8601; 8 января 1999 года в любом режиме
990108ISO 8601; 8 января 1999 года в любом режиме
1999.008год и день года
J2451187юлианская дата
January 8, 99 BC99 год до нашей эры

Время

Типы времени суток — это time [ (p) ] without time zone и time [ (p) ] with time zone. Указание time без уточнения равнозначно time without time zone.

Допустимые входные данные для этих типов состоят из времени суток, за которым следует необязательный часовой пояс. (См. Таблицу 11 и Таблицу 12.) Если во входных данных для time without time zone указывается часовой пояс, он просто игнорируется. Также можно указать дату, но она будет игнорироваться, если только не использовать имя часового пояса, включающее правило перехода на летнее время, например America/New_York. В этом случае указание даты требуется для определения того, какое время применяется: стандартное или летнее. Соответствующее смещение часового пояса записывается в значение time with time zone и выводится в том виде, в каком хранится; оно не подстраивается под активный часовой пояс.

Таблица 11. Ввод времени

ПримерОписание
04:05:06.789ISO 8601
04:05:06ISO 8601
04:05ISO 8601
040506ISO 8601
04:05 AMто же, что и 04:05; AM не влияет на значение времени
04:05 PMто же, что и 16:05; вводимый час должен быть <= 12
04:05:06.789-8ISO 8601, с часовым поясом в виде смещения от UTC
04:05:06-08:00ISO 8601, с часовым поясом в виде смещения от UTC
04:05-08:00ISO 8601, с часовым поясом в виде смещения от UTC
040506-08ISO 8601, с часовым поясом в виде смещения от UTC
040506+0730ISO 8601, с часовым поясом в виде нецелочисленного смещения от UTC
040506+07:30:00смещение от UTC, с точностью до секунд (не допускается в ISO 8601)
04:05:06 PSTчасовой пояс, заданный аббревиатурой
2003-04-12 04:05:06 America/New_Yorkчасовой пояс, заданный полным названием

Таблица 12. Ввод часового пояса

ПримерОписание
PSTАббревиатура (для тихоокеанского стандартного времени)
America/New_YorkПолное название часового пояса
PST8PDTУказание часового пояса в стиле POSIX
-8:00:00Смещение часового пояса PST от UTC
-8:00Смещение часового пояса PST от UTC (расширенный формат ISO-8601)
-800Смещение часового пояса PST от UTC (стандартный формат ISO-8601)
-8Смещение часового пояса PST от UTC (стандартный формат ISO-8601)
zuluАббревиатура для UTC, принятая у военных
zКраткая форма zulu (тоже определена в ISO-8601)

Дополнительную информацию о том, как задавать часовые пояса см. в подразделе Часовые пояса.


Временные метки

Допустимые входные значения для типов временных меток состоят из конкатенации даты и времени, за которой следует необязательный часовой пояс и необязательное уточнение AD или BC. (Как вариант, AD/BC можно указать и перед часовым поясом, но это нежелательно.) Таким образом:

1999-01-08 04:05:06

и:

1999-01-08 04:05:06 -8:00

являются допустимыми вариантами, соответствующими стандарту ISO 8601. Кроме того, поддерживается общий формат:

January 8 04:05:06 1999 PST

Стандарт SQL различает литералы timestamp without time zone и timestamp with time zone по наличию символа «+» или «-» и смещению часового пояса, указанному после времени. Следовательно, согласно стандарту,

TIMESTAMP '2004-10-19 10:23:54'

это timestamp without time zone, а

TIMESTAMP '2004-10-19 10:23:54+02'

это timestamp with time zone. QHB никогда не проверяет содержимое литеральной строки перед определением ее типа, поэтому она будет обрабатывать оба приведенных выше выражения как timestamp without time zone. Чтобы литерал обрабатывался как timestamp with time zone, присвойте ему правильный явный тип:

TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'

В значении, которое было определено как timestamp without time zone, QHB будет просто игнорировать любую индикацию часового пояса. То есть результирующее значение получается из полей даты/времени во входной строке и не корректируется для часового пояса.

Для значений timestamp with time zone входная строка, содержащая явный часовой пояс, будет преобразована в UTC (Universal Coordinated Time, всемирное координированное время) с использованием соответствующего смещения для этого часового пояса. Если в входной строке часовой пояс не указан, подразумевается часовой пояс, заданный системным параметром TimeZone, который преобразуется в UTC с использованием смещения для часового пояса timezone. В обоих случаях это значение внутренне хранится как UTC, а изначально заявленный или предполагаемый часовой пояс не сохраняется.

При выводе значение timestamp without time zone всегда преобразуется из UTC в текущий часовой пояс timezone и отображается как местное время в этом поясе. Чтобы увидеть время в другом часовом поясе, следует изменить timezone или воспользоваться конструкцией AT TIME ZONE (см. подраздел AT TIME ZONE).

Преобразования между timestamp without time zone и timestamp with time zone обычно предполагают, что значение timestamp without time zone должно быть принято или задано как местное время пояса timezone. С помощью AT TIME ZONE при преобразовании можно указать другой часовой пояс.


Специальные значения

Для удобства QHB поддерживает несколько специальных значений ввода даты/времени, показанных в Таблице 13. Значения infinity и -infinity имеют особое представление внутри системы и будут отображаться без изменений; другие же являются простыми сокращениями, которые при чтении будут преобразованы в обычные значения даты/времени. (В частности, now и схожие строки преобразуются в актуальные на момент прочтения значения времени.) При использовании в качестве констант в командах SQL все эти значения следует заключать в апострофы.

Таблица 13. Специальные входные значения даты/времени

Строка вводаДопустимые типыОписание
epochdate, timestamp1970-01-01 00:00:00+00 (начало отсчета времени в Unix)
infinitydate, timestampвремя после всех остальных временных меток
-infinitydate, timestampвремя до всех остальных временных меток
nowdate, time, timestampвремя начала текущей транзакции
todaydate, timestampвремя начала текущих суток (00:00)
tomorrowdate, timestampвремя начала следующих суток (00:00)
yesterdaydate, timestampвремя начала предыдущих суток (00:00)
allballstime00:00:00.00 UTC

Для получения текущего значения времени для соответствующего типа данных можно также воспользоваться следующими SQL-совместимыми функциями: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP. (См. подраздел Текущая дата/время.) Обратите внимание, что это функции SQL, которые не распознаются в строках ввода данных.

ВНИМАНИЕ!
Хотя использование входных строк now, today, tomorrow и yesterday при взаимодействии с командами SQL вполне допустимо, при сохранении команд для последующего выполнения, например, в подготовленных операторах, представлениях или определениях функций, их поведение может быть неожиданным. Такая строка может преобразоваться в конкретное значение времени, которое будет продолжать использоваться даже после того, как потеряет свою актуальность. В таких случаях вместо этих строк лучше прибегнуть к помощи одной из функций SQL. Например, CURRENT_DATE + 1 надежнее, чем 'tomorrow'::date.



Вывод даты/времени

Формат вывода типов даты/времени можно установить в одном из четырех стилей: ISO 8601, SQL (Ingres), традиционный POSTGRES (формат даты Unix) или German (немецкий). По умолчанию используется формат ISO. (Стандарт SQL требует, чтобы использовался именно формат ISO 8601. Название «SQL» дано другому формату только по историческим причинам и носит случайный характер.) В Таблице 14 приведены примеры каждого стиля вывода. Согласно приведенным примерам, выходные данные типов date и time, как правило, представляют собой только часть даты или времени. Однако в стиле POSTGRES значение даты без времени выводится в формате ISO.

Таблица 14. Стили вывода даты/времени

СтильОписаниеПример
ISOISO 8601, стандарт SQL1997-12-17 07:37:16-08
SQLтрадиционный стиль12/17/1997 07:37:16.00 PST
POSTGRESоригинальный стильWed Dec 17 07:37:16 1997 PST
Germanрегиональный стиль17.12.1997 07:37:16.00 PST

Примечание
ISO 8601 указывает, что для разделения даты и времени используется буква Т в верхнем регистре. QHB принимает этот формат при вводе, но на выходе, как показано выше, использует пробел, а не T. Это сделано для удобочитаемости и для соответствия RFC 3339, а также некоторым другим СУБД.

В стилях SQL и POSTGRES день отображается перед месяцем, если указан порядок полей DMY, в противном случае месяц отображается перед днем. (Информацию о том, как этот параметр также влияет на интерпретацию входных значений см. в подразделе Ввод даты/времени.) В Таблице 15 приведены соответствующие примеры.

Таблица 15. Соглашение о порядке отображения компонентов даты

Значение datestyleПорядок вводаПример вывода
SQL, DMYдень/месяц/год17/12/1997 15:37:16.00 CET
SQL, MDYмесяц/день/год12/17/1997 07:37:16.00 PST
Postgres, DMYдень/месяц/годWed 17 Dec 07:37:16 1997 PST

В стиле ISO часовой пояс всегда отображается в виде снабженного знаком числового смещения относительно UTC, где положительный знак используется для поясов к востоку от Гринвича. Смещение будет отображаться как чч (только часы), если оно является целым числом часов, либо как чч:мм, если оно является целым числом минут, либо как чч:мм:сс. (Третий вариант невозможен в современных стандартах часовых поясов, но может пригодиться при работе с временными метками, предшествующими принятию стандартизированных часовых поясов.) В других стилях даты часовой пояс отображается в виде буквенной аббревиатуры, если таковая принята в текущем часовом поясе. В противном случае он отображается в виде числового смещения со знаком в стандартном формате ISO 8601 (чч или ччмм).

Пользователь может выбрать стиль даты/времени с помощью команды SET datestyle, параметра DateStyle в файле конфигурации qhb.conf или переменной среды PGDATESTYLE на сервере или клиенте.

Также в качестве более гибкого способа форматирования вывода даты/времени имеется функция to_char (см. раздел Функции для форматирования типов данных).



Часовые пояса

Часовые пояса и соглашения об их применении зависят от политических решений, а не только от географии. В начале прошлого века часовые пояса во всем мире были в некоторой степени стандартизированы, но продолжают претерпевать произвольные изменения, особенно в отношении правил перехода на летнее время. Для получения информации об отмененных правилах, касающихся часовых поясов, QHB использует широко распространенную базу данных часовых поясов IANA (Olson). Относительно будущего времени предполагается, что в заданном часовом поясе последние известные правила так и останутся неизменными.

В большинстве случаев QHB стремится к совместимости с определениями стандарта SQL. Однако стандарт SQL включает странное сочетание типов и возможностей даты и времени. Есть две очевидные проблемы:

  • Хотя у типа date не может быть связанного часового пояса, для типа time его можно указать. В реальном мире часовые пояса не имеют большого значения, если они не связаны одновременно с датой и с временем, поскольку смещение может изменяться в течение года вместе с границами летнего времени.

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

Во избежание этих трудностей рекомендуется при использовании часовых поясов выбирать типы даты/времени, содержащие и дату, и время. Мы не рекомендуем использовать тип time with time zone (хотя он и поддерживается QHB для соответствия стандарту SQL). Для всех типов, содержащих только дату или только время, в QHB предполагается местный часовой пояс.

Все значения даты и времени с учетом часового пояса хранятся внутри в формате UTC. Перед предоставлением клиенту они преобразуются в местное время в зоне, указанной параметром конфигурации TimeZone.

QHB позволяет указывать часовые пояса в трех разных формах:

  • Полное название часового пояса, например America/New_York. Распознанные имена часовых поясов перечислены в представлении pg_timezone_names. Для этой цели QHB использует широко распространенные данные о часовых поясах IANA, поэтому имена часовых поясов QHB распознаются также и другими приложениями.

  • Аббревиатура часового пояса, например, PST. В отличие от полных имен часовых поясов, которые также могут подразумевать набор правил перехода на летнее время, такая спецификация просто определяет конкретное смещение от UTC. Распознаваемые аббревиатуры перечислены в представлении pg_timezone_abbrevs. Аббревиатуры часового пояса нельзя задать в параметрах конфигурации TimeZone или log_timezone, но можно использовать во входных значениях даты/времени и в операторе AT TIME ZONE.

  • В дополнение к названиям и аббревиатурам часовых поясов QHB будет принимать спецификации часовых поясов в стиле POSIX, как описано в разделе Указание часовых поясов в стиле POSIX. Обычно этот вариант менее предпочтителен, чем использование именованного часового пояса, но может понадобиться, если для нужного часового пояса нет подходящей записи в базе IANA.

Иными словами, разница между аббревиатурами и полными названиями состоит в том, что аббревиатуры представляют конкретное смещение от UTC, тогда как многие полные названия подразумевают еще и местное правило перехода на летнее время и, соответственно, два возможных смещения UTC. Например, 2014-06-04 12:00 America/New_York представляет полдень по местному времени в Нью-Йорке, что для этого конкретного дня было восточным летним временем (UTC-4). Так что 2014-06-04 12:00 EDT обозначает тот же момент времени. Но 2014-06-04 12:00 EST обозначает полдень по восточному стандартному времени (UTC-5) независимо от того, действовало ли в этот день летнее время.

Дело осложняется тем, что в некоторых юрисдикциях одна и та же аббревиатура часового пояса используется для обозначения разных смещений UTC в разное время; например, в Москве MSK несколько лет означало UTC+3, а потом — UTC+4. QHB интерпретирует такие аббревиатуры в соответствии с тем, что они означают (или означали совсем недавно) в указанную дату; но, как и в приведенном выше примере с EST, это не обязательно будет соответствовать местному гражданскому времени на эту дату.

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

Ни имена часовых поясов, ни аббревиатуры не зашиты в сервер; они берутся из файлов конфигурации, хранящихся в папках .../share/timezone/ и .../share/timezonesets/ установочного каталога (см. раздел Файлы конфигурации даты/времени).

Параметр конфигурации TimeZone можно установить в файле qhb.conf или любым другим стандартным способом, описанным в главе Конфигурация сервера. Есть также несколько специальных способов установить его:

  • SQL-команда SET TIME ZONE устанавливает часовой пояс для текущего сеанса. Это альтернативное написание команды SET TIMEZONE TO, более совместимое со стандартом SQL.

  • Переменная среды PGTZ используется клиентами libpq для отправки команды SET TIME ZONE на сервер при подключении.



Ввод интервалов

Значения типа interval можно записать с помощью следующего подробного синтаксиса:

[@] количество единица [количество единица...] [направление]

где количество — это число (возможно, со знаком); единица — это одно из значений: microsecond, millisecond, second, minute, hour, day, week, month, year, decade, century, millennium (микросекунды, миллисекунды, секунды, минуты, часы, дни, недели, месяцы, годы, десятилетия, века и тысячелетия соответственно), либо сокращения или множественные формы этих слов; направление может принимать значение ago (назад) или быть пустым. Знак @ является необязательным. Величины различных единиц неявно суммируются с учетом соответствующего знака чисел. Указание ago меняет знак всех полей на противоположный. Этот синтаксис также используется при выводе интервала, если для параметра IntervalStyle установлено значение postgres_verbose.

Количество дней, часов, минут и секунд можно задать без явного указания единиц измерения. Например, '1 12:59:10' читается так же, как '1 day 12 hours 59 min 10 sec'. Кроме того, комбинацию лет и месяцев можно указать с тире; например, '200-10' читается так же, как '200 years 10 months'. (Фактически только эти более короткие формы и разрешены стандартом SQL, и они используются при выводе, когда для IntervalStyle установлено значение sql_standard).

Значения интервалов также можно записать в виде временных интервалов, определенных в ISO 8601, используя либо «формат с кодами» раздела 4.4.3.2 этого стандарта, либо «альтернативный формат» раздела 4.4.3.3. Формат с кодами выглядит так:

P количество единица [ количество единица ...] [ T [ количество единица ...]]

Строка должна начинаться с буквы P и может содержать букву T, предваряющую единицы времени суток. Имеющиеся сокращения единиц приведены в Таблице 16. Единицы можно опускать и указывать в любом порядке, но после T должны идти единицы меньше дня. В частности, значение кода M зависит от того, находится ли он до или после T

Таблица 16. Сокращения единиц временных интервалов ISO 8601

АббревиатураЗначение
YГоды
MМесяцы (в дате)
WНедели
DДни
HЧасы
MМинуты (во времени)
SСекунды

В альтернативном формате:

P [ годы-месяцы-дни ] [ T часы:минуты:секунды ]

строка должна начинаться с P, а T разделяет компоненты даты и времени. Значения приведены в виде чисел, аналогичных датам ISO 8601.

При записи интервальной константы со указанием полей или присвоении интервальному столбцу строки с полями интерпретация немаркированных величин зависит от полей. Например, INTERVAL '1' YEAR читается как 1 год, а INTERVAL '1' — как 1 секунда. Кроме того, значения полей «справа» от наименее значимого поля, разрешенного в определении полей, просто отбрасываются. Например, в записи INTERVAL '1 day 2:03:04' HOUR TO MINUTE будет удалено поле секунд, но не дня.

Согласно стандарту SQL, все поля значения interval должны иметь одинаковый знак, поэтому ведущий отрицательный знак применяется ко всем полям; например, знак минус в интервальном литерале '-1 2:03:04' применяется как к дням, так и к часам/минутам/секундам. QHB позволяет полям иметь разные знаки и традиционно независимо обрабатывает знак каждого поля в текстовом представлении, так что в этом примере часы/минуты/секунды считаются положительными. Если для IntervalStyle установлено значение sql_standard, то ведущий знак считается применимым ко всем полям (но только при отсутствии дополнительных знаков). В противном случае используется традиционная интерпретация QHB. Во избежание неоднозначности, если какое-либо поле является отрицательным, рекомендуется прикреплять явный знак к каждому полю.

Внутренне значения типа interval хранятся в виде трех целочисленных полей: месяцы, дни и микросекунды. Эти поля хранятся отдельно, потому что число дней в месяце варьируется, и в сутках может быть 23 или 25 часов, если происходит корректировка перехода на летнее время. Входная строка интервала, где используются другие единицы, нормализуется в этот формат, а затем стандартизированным образом реконструируется для вывода, например:

SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::interval;
               interval
---------------------------------------
 3 years 3 mons 700 days 133:17:36.789

Здесь недели, под которыми поднимаются «7 дней», были сохранены отдельно, тогда как меньшие и большие единицы измерения времени, были объединены и нормализованы.

Входные значения полей могут иметь дробные части, например '1.5 week' или '01:02:03.45'. Однако поскольку interval внутренне сохраняет только целочисленные поля, дробные значения следует преобразовать в меньшие единицы. Дробные части единиц больше месяцев округляются до целого числа месяцев, например, '1.5 years' становится '1 year 6 mons'. Дробные части недель и дней преобразуются в целое число дней и микросекунд, исходя из предположения, что в месяце 30 дней, а в дне 24 часа, например, '1.75 months' становится 1 mon 22 days 12:00:00. В виде дробного числа в выводе будут отображаться только секунды.

В Таблице 17 приведены некоторые примеры допустимых входных значений типа interval.

Таблица 17. Ввод интервалов

ПримерОписание
1-2Стандартный формат SQL: 1 год 2 месяца
3 4:05:06Стандартный формат SQL: 3 дня 4 часа 5 минут 6 секунд
1 year 2 months 3 days 4 hours 5 minutes 6 secondsТрадиционный формат Postgres: 1 год 2 месяца 3 дня 4 часа 5 минут 6 секунд
P1Y2M3DT4H5M6S«Формат с кодами» ISO 8601: то же значение, что и выше
P0001-02-03T04:05:06«Альтернативный формат» ISO 8601: то же значение, что и выше


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

Как объяснялось ранее, QHB хранит значения interval в виде месяцев, дней и микросекунд. Для вывода поле месяцев преобразуется в годы и месяцы путем деления на 12. Поле дней отображается как есть. Поле микросекунд преобразуется в часы, минуты, секунды и доли секунды. Таким образом, месяцы, минуты и секунды никогда не будут отображаться за пределами диапазонов 0–11, 0–59 и 0–59 соответственно, тогда как отображаемые поля лет, дней и часов могут быть довольно большими. (При необходимости перенести большие значения дней или часов в следующее поле можно воспользоваться функциями justify_days и justify_hours.)

Формат вывода типа interval можно установить в одном из четырех стилей: sql_standard, postgres, postgres_verbose или iso_8601 с помощью команды SET intervalstyle. По умолчанию используется формат postgres. В Таблице 18 приведены примеры каждого стиля вывода.

Стиль sql_standard создает выходные данные, соответствующие определению стандарта SQL для литеральных строк интервалов, если значение интервала соответствует ограничениям стандарта (только год-месяц или только день-время, без смешивания положительных и отрицательных компонентов). В противном случае выходные данные выглядят как стандартная литеральная строка год-месяц, за которой следует литеральная строка день-время с явными знаками, добавленными для устранения неоднозначности интервалов со смешанными знаками.

Вывод в стиле postgres соответствует формату QHB, когда для параметра DateStyle установлено значение ISO.

Вывод в стиле postgres_verbose соответствует формату QHB, когда для параметра DateStyle установлено значение, отличное от ISO.

Вывод в стиле iso_8601 соответствует «формату с кодами, описанному в разделе 4.4.3.2 стандарта ISO 8601.

Таблица 18. Примеры стилей вывода интервалов

СтильИнтервал год-месяцИнтервал день-времяСмешанный интервал
sql_standard1-23 4:05:06-1-2 +3 -4: 05: 06
postgres1 year 2 mons3 days 04:05:06-1 year -2 mons +3 days -04:05:06
postgres_verbose@ 1 year 2 mons@ 3 days 4 hours 5 mins 6 secs@ 1 year 2 mons -3 days 4 hours 5 mins 6 secs ago
iso_8601P1Y2MP3DT4H5M6SР-1Y-2M3DT-4H-5M-6S