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

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

Функция to_timestamp может иметь также один аргумент; в этом случае она принимает число double precision и преобразует его из времени Unix (число секунд с 1970-01-01 00:00:00+00) в timestamp with time zone (время с часовым поясом). (Значения времени Unix типа Integer просто неявно приводятся к типу double precision.)

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

ФункцияТип результатаОписаниеПример
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(double precision) timestamp with time zone преобразует время в стиле Unix в стандартное время to_timestamp(1284352323)

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

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

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

КодОписание
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 г. до н. э.)
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-23.

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

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

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

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

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

КодОписание
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-25.

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

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

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

Таблица 9-26. Примеры 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'