Типы даты/времени
QHB поддерживает полный набор типов даты и времени SQL, приведенных в Таблице 9. Операции, доступные для этих типов данных, описаны в разделе Функции и операторы даты/времени. Даты подсчитываются в соответствии с григорианским календарем, даже для времени до его введения (дополнительную информацию см. в подразделе История единиц измерения времени).
Таблица 9. Типы даты/времени
Имя | Размер | Описание | Наименьшее значение | Наибольшее значение | Точность |
---|---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] | 8 байт | дата и время (без часового пояса) | 4713 г. до н. э. | 294276 н. э. | 1 микросекунда |
timestamp [ (p) ] with time zone | 8 байт | дата и время с часовым поясом | 4713 г. до н. э. | 294276 н.э. | 1 микросекунда |
date | 4 байта | дата (без времени суток) | 4713 г. до н. э. | 5874897 н. э. | 1 день |
time [ (p**) ] [ without time zone ] | 8 байт | время суток (без даты) | 00:00:00 | 24:00:00 | 1 микросекунда |
time [ (p) ] with time zone | 12 байт | время суток (без даты) с часовым поясом | 00: 00: 00+1459 | 24: 00: 00-1459 | 1 микросекунда |
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-08 | ISO 8601; 8 января в любом режиме (рекомендуемый формат) |
January 8, 1999 | определяется однозначно в любом режиме ввода datestyle |
1/8/1999 | 8 января в режиме MDY; 1 августа в режиме DMY |
1/18/1999 | 18 января в режиме MDY; недопустимая дата в других режимах |
01/02/03 | 2 января 2003 г. в режиме MDY; 1 февраля 2003 г. в режиме DMY; 3 февраля 2001 г. в режиме YMD |
1999-Jan-08 | 8 января в любом режиме |
Jan-08-1999 | 8 января в любом режиме |
08-Jan-1999 | 8 января в любом режиме |
99-Jan-08 | 8 января в режиме YMD; ошибка в других режимах |
08-Jan-99 | 8 января; ошибка в режиме YMD |
Jan-08-99 | 8 января; ошибка в режиме YMD |
19990108 | ISO 8601; 8 января 1999 года в любом режиме |
990108 | ISO 8601; 8 января 1999 года в любом режиме |
1999.008 | год и день года |
J2451187 | Юлианская дата |
January 8, 99 BC | 99 год до нашей эры |
Время
Типы времени суток — это 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.789 | ISO 8601 |
04:05:06 | ISO 8601 |
04:05 | ISO 8601 |
040506 | ISO 8601 |
04:05 AM | то же, что и 04:05; AM не влияет на значение времени |
04:05 PM | то же, что и 16:05; вводимый час должен быть <= 12 |
04:05:06.789-8 | ISO 8601, с часовым поясом в виде смещения от UTC |
04:05:06-08:00 | ISO 8601, с часовым поясом в виде смещения от UTC |
04:05-08:00 | ISO 8601, с часовым поясом в виде смещения от UTC |
040506-08 | ISO 8601, с часовым поясом в виде смещения от UTC |
040506+0730 | ISO 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 (универсальное координированное время, традиционно известное как среднее время по Гринвичу, GMT.) Входное значение с явно указанным часовым поясом преобразуется в UTC с использованием соответствующего смещения для этого часового пояса. Если во входной строке часовой пояс не указан, подразумевается часовой пояс, заданный системным параметром TimeZone, который преобразуется в UTC с использованием смещения для зоны timezone.
Когда выводится значение timestamp without time zone, оно всегда преобразуется из UTC в текущую зону часового пояса и отображается как местное время в этой зоне. Чтобы увидеть время в другом часовом поясе, следует изменить часовой пояс или воспользоваться конструкцией 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. Специальные входные значения даты/времени
Строка ввода | Действительные типы | Описание |
---|---|---|
epoch | date, timestamp | 1970-01-01 00:00:00+00 (начало отсчета времени в Unix) |
infinity | date, timestamp | время после всех остальных отметок времени |
-infinity | date, timestamp | время до всех остальных отметок времени |
now | date, time, timestamp | время начала текущей транзакции |
today | date, timestamp | время начала текущих суток (00:00) |
tomorrow | date, timestamp | время начала следующих суток (00:00) |
yesterday | date, timestamp | время начала предыдущих суток (00:00) |
allballs | time | 00: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) или немецкий. По умолчанию используется формат ISO. (Стандарт SQL требует, чтобы использовался именно формат ISO 8601. Название «SQL» дано другому формату только по историческим причинам и носит случайный характер.) В Таблице 14 приведены примеры каждого стиля вывода. Согласно приведенным примерам, выходные данные типов date и time, как правило, представляют собой только часть даты или времени. Однако в стиле POSTGRES значение даты без времени выводится в формате ISO.
Таблица 14. Стили вывода даты/времени
Стиль | Описание | пример |
---|---|---|
ISO | ISO 8601, стандарт SQL | 1997-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).
Значения типа interval также можно записать в виде временных интервалов, определенных в 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.
Во избежание неоднозначности, если какое-либо поле является отрицательным,
рекомендуется прикреплять явный знак к каждому полю.
В подробном формате ввода и в некоторых полях более компактных форматов ввода
значения полей могут иметь дробные части, например '1.5 week'
или
'01:02:03.45'
. Такое входное значение при сохранении преобразуется в
соответствующее число месяцев, дней и секунд. Когда в результате у месяцев или
дней появляется дробное число, эта дробь добавляется в поля младшего разряда с
использованием коэффициентов преобразования 1 месяц = 30 дней и 1 день =
24 часа. Например, '1.5 month'
превращается в 1 месяц и 15 дней. В виде
дробного числа будут отображаться только секунды.
В Таблице 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 | Традиционный формат PostgreSQL: 1 год 2 месяца 3 дня 4 часа 5 минут 6 секунд |
P1Y2M3DT4H5M6S | «Формат с кодами» ISO 8601: то же значение, что и выше |
P0001-02-03T04:05:06 | «Альтернативный формат» ISO 8601: то же значение, что и выше |
Внутренние значения типа interval хранятся в виде месяцев, дней и секунд. Это сделано потому, что число дней в месяце варьируется, и в сутках может быть 23 или 25 часов, если происходит корректировка перехода на летнее время. Поля месяца и дня являются целыми числами, а поле секунд может быть дробным. Поскольку интервалы обычно получаются из константных строк или при вычитании меток времени, этот метод хранения применим в большинстве случаев, но может привести к неожиданным результатам:
SELECT EXTRACT(hours from '80 minutes'::interval);
date_part
-----------
1
SELECT EXTRACT(days from '80 hours'::interval);
date_part
-----------
0
Для настройки дней и часов, выходящих за пределы нормальных диапазонов доступны функции 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_standard | 1-2 | 3 4:05:06 | -1-2 +3 -4: 05: 06 |
postgres | 1 year 2 mons | 3 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_8601 | P1Y2M | P3DT4H5M6S | Р-1Y-2M3DT-4H-5M-6S |