9.8. Функции форматирования данных

Функции форматирования в PostgreSQL предоставляют богатый набор инструментов для преобразования самых разных типов данных (дата/время, целое, числа с плавающей и фиксированной точкой) в форматированные строки и обратно. Все они перечислены в Таблице 9.23. Все эти функции следует одному соглашению: в первом аргументе передаётся значение, которое нужно отформатировать, а во втором — шаблон, определяющий формат ввода или вывода.

Таблица 9.23. Функции форматирования

ФункцияТип результатаОписаниеПример
to_char(timestamp, text) textпреобразует время в текстto_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text)textпреобразует интервал в текстto_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text)textпреобразует целое в текстto_char(125, '999')
to_char(double precision, text)textпреобразует плавающее одинарной/двойной точности в текстto_char(125.8::real, '999D9')
to_char(numeric, text)textпреобразует числовое значение в текстto_char(-125.8, '999D99S')
to_date(text, text) dateпреобразует текст в датуto_date('05 Dec 2000', 'DD Mon YYYY')
to_number(text, text) numericпреобразует текст в числоto_number('12,454.8-', '99G999D9S')
to_timestamp(text, text) timestamp with time zoneпреобразует строку во времяto_timestamp('05 Dec 2000', 'DD Mon YYYY')

Примечание

Также имеется функция to_timestamp с одним аргументом; см. Таблицу 9.30.

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

Все коды форматирования даты и времени перечислены в Таблице 9.24.

Таблица 9.24. Коды форматирования даты/времени

КодОписание
HHчас (01-12)
HH12час (01-12)
HH24час (00-23)
MIминута (00-59)
SSсекунда (00-59)
MSмиллисекунда (000-999)
USмикросекунда (000000-999999)
SSSSчисло секунд с начала суток (0-86399)
AM, am, PM или pmобозначение времени до/после полудня (без точек)
A.M., a.m., P.M. или p.m.обозначение времени до/после полудня (с точками)
Y,YYYгод (4 или более цифр) с разделителем
YYYYгод (4 или более цифр)
YYYпоследние 3 цифры года
YYпоследние 2 цифры года
Yпоследняя цифра года
IYYYнедельный год по ISO 8601 (4 или более цифр)
IYYпоследние 3 цифры недельного года по ISO 8601
IYпоследние 2 цифры недельного года по ISO 8601
Iпоследняя цифра недельного года по ISO 8601
BC, bc, AD или adобозначение эры (без точек)
B.C., b.c., A.D. или a.d.обозначение эры (с точками)
MONTHполное название месяца в верхнем регистре (дополненное пробелами до 9 символов)
Monthполное название месяца с большой буквы (дополненное пробелами до 9 символов)
monthполное название месяца в нижнем регистре (дополненное пробелами до 9 символов)
MONсокращённое название месяца в верхнем регистре (3 буквы в английском; в других языках длина может меняться)
Monсокращённое название месяца с большой буквы (3 буквы в английском; в других языках длина может меняться)
monсокращённое название месяца в нижнем регистре (3 буквы в английском; в других языках длина может меняться)
MMномер месяца (01-12)
DAYполное название дня недели в верхнем регистре (дополненное пробелами до 9 символов)
Dayполное название дня недели с большой буквы (дополненное пробелами до 9 символов)
dayполное название дня недели в нижнем регистре (дополненное пробелами до 9 символов)
DYсокращённое название дня недели в верхнем регистре (3 буквы в английском; в других языках может меняться)
Dyсокращённое название дня недели с большой буквы (3 буквы в английском; в других языках длина может меняться)
dyсокращённое название дня недели в нижнем регистре (3 буквы в английском; в других языках длина может меняться)
DDDномер дня в году (001-366)
IDDDномер дня в году по ISO 8601 (001-371; 1 день — понедельник первой недели по ISO)
DDдень месяца (01-31)
Dномер дня недели, считая с воскресенья (1) до субботы (7)
IDномер дня недели по ISO 8601, считая с понедельника (1) до воскресенья (7)
Wнеделя месяца (1-5) (первая неделя начинается в первое число месяца)
WWномер недели в году (1-53) (первая неделя начинается в первый день года)
IWномер недели в году по ISO 8601 (01-53; первый четверг года относится к неделе 1)
CCвек (2 цифры) (двадцать первый век начался 2001-01-01)
JЮлианская дата (целое число дней от 24 ноября 4714 г. до н. э. 00:00 по местному времени; см. Раздел B.7)
Qквартал (игнорируется функциями to_date и to_timestamp)
RMномер месяца римскими цифрами в верхнем регистре (I-XII; I=январь)
rmномер месяца римскими цифрами в нижнем регистре (i-xii; i=январь)
TZсокращённое название часового пояса в верхнем регистре (поддерживается только в to_char)
tzсокращённое название часового пояса в нижнем регистре (поддерживается только в to_char)
OFсмещение часового пояса от UTC (поддерживается только в to_char)

К любым кодам форматирования можно добавить модификаторы, изменяющие их поведение. Например, шаблон форматирования FMMonth включает код Month с модификатором FM. Модификаторы, предназначенные для форматирования даты/времени, перечислены в Таблице 9.25.

Таблица 9.25. Модификаторы кодов для форматирования даты/времени

МодификаторОписаниеПример
Приставка FMрежим заполнения (подавляет ведущие нули и дополнение пробелами)FMMonth
Окончание THокончание порядкового числительного в верхнем регистреDDTH, например 12TH
Окончание thокончание порядкового числительного в нижнем регистреDDth, например 12th
Приставка FXглобальный параметр фиксированного формата (см. замечания)FX Month DD Day
Приставка TMрежим перевода (выводятся локализованные названия дней и месяцев, исходя из lc_time)TMMonth
Окончание SPрежим числа прописью (не реализован)DDSP

Замечания по использованию форматов даты/времени:

Коды форматирования числовых значений перечислены в Таблице 9.26.

Таблица 9.26. Коды форматирования чисел

КодОписание
9позиция цифры (может отсутствовать, если цифра незначащая)
0позиция цифры (присутствует всегда, даже если цифра незначащая)
. (точка)десятичная точка
, (запятая)разделитель групп (тысяч)
PRотрицательное значение в угловых скобках
Sзнак, добавляемый к числу (с учётом локали)
Lсимвол денежной единицы (с учётом локали)
Dразделитель целой и дробной части числа (с учётом локали)
Gразделитель групп (с учётом локали)
MIзнак минус в заданной позиции (если число < 0)
PLзнак плюс в заданной позиции (если число > 0)
SGзнак плюс или минус в заданной позиции
RNчисло римскими цифрами (в диапазоне от 1 до 3999)
TH или thокончание порядкового числительного
Vсдвиг на заданное количество цифр (см. замечания)
EEEEэкспоненциальная запись числа

Замечания по использованию форматов чисел:

Для изменения поведения кодов к ним могут быть применены определённые модификаторы. Например, FM99.99 обрабатывается как код 99.99 с модификатором FM. Все модификаторы для форматирования чисел перечислены в Таблице 9.27.

Таблица 9.27. Модификаторы шаблонов для форматирования чисел

МодификаторОписаниеПример
Приставка FMрежим заполнения (подавляет завершающие нули и дополнение пробелами)FM99.99
Окончание THокончание порядкового числительного в верхнем регистре999TH
Окончание thокончание порядкового числительного в нижнем регистре999th

В Таблице 9.28 приведены некоторые примеры использования функции to_char.

Таблица 9.28. Примеры to_char

ВыражениеРезультат
to_char(current_timestamp, 'Day, DD  HH12:MI:SS')'Tuesday  , 06  05:39:18'
to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS')'Tuesday, 6  05:39:18'
to_char(-0.1, '99.99')'  -.10'
to_char(-0.1, 'FM9.99')'-.1'
to_char(-0.1, 'FM90.99')'-0.1'
to_char(0.1, '0.9')' 0.1'
to_char(12, '9990999.9')'    0012.0'
to_char(12, 'FM9990999.9')'0012.'
to_char(485, '999')' 485'
to_char(-485, '999')'-485'
to_char(485, '9 9 9')' 4 8 5'
to_char(1485, '9,999')' 1,485'
to_char(1485, '9G999')' 1 485'
to_char(148.5, '999.999')' 148.500'
to_char(148.5, 'FM999.999')'148.5'
to_char(148.5, 'FM999.990')'148.500'
to_char(148.5, '999D999')' 148,500'
to_char(3148.5, '9G999D999')' 3 148,500'
to_char(-485, '999S')'485-'
to_char(-485, '999MI')'485-'
to_char(485, '999MI')'485 '
to_char(485, 'FM999MI')'485'
to_char(485, 'PL999')'+485'
to_char(485, 'SG999')'+485'
to_char(-485, 'SG999')'-485'
to_char(-485, '9SG99')'4-85'
to_char(-485, '999PR')'<485>'
to_char(485, 'L999')'DM 485'
to_char(485, 'RN')'        CDLXXXV'
to_char(485, 'FMRN')'CDLXXXV'
to_char(5.2, 'FMRN')'V'
to_char(482, '999th')' 482nd'
to_char(485, '"Good number:"999')'Good number: 485'
to_char(485.8, '"Pre:"999" Post:" .999')'Pre: 485 Post: .800'
to_char(12, '99V999')' 12000'
to_char(12.4, '99V999')' 12400'
to_char(12.45, '99V9')' 125'
to_char(0.0004859, '9.99EEEE')' 4.86e-04'