9.8. Функции форматирования типов данных#
9.8. Функции форматирования типов данных #
Функции форматирования Tantor SE-1C предоставляют мощный набор инструментов для преобразования различных типов данных (дата/время, целое число, число с плавающей запятой, числовое) в отформатированные строки и для преобразования отформатированных строк в конкретные типы данных. Таблица 9.26 перечисляет их. Все эти функции следуют общему соглашению о вызове: первый аргумент - это значение, которое нужно отформатировать, а второй аргумент - это шаблон, который определяет формат вывода или ввода.
Таблица 9.26. Функции форматирования
Функция Описание Пример(ы) |
---|
Преобразует временную метку в строку в соответствии с заданным форматом.
|
Преобразует интервал в строку в соответствии с заданным форматом.
|
Преобразует число в строку в соответствии с заданным форматом; доступно для типов
|
Преобразует строку в дату в соответствии с заданным форматом.
|
Преобразует строку в числовое значение в соответствии с заданным форматом.
|
Преобразует строку в метку времени в соответствии с заданным форматом.
(См. также функцию
|
Подсказка
Существуют функции to_timestamp
и to_date
, предназначенные для обработки форматов ввода, которые не могут быть преобразованы простым приведением типов. Для большинства стандартных форматов даты/времени достаточно привести исходную строку к требуемому типу данных, что намного проще. Аналогично, функция to_number
не требуется для стандартных числовых представлений.
В шаблонной строке вывода функции to_char
есть определенные шаблоны, которые распознаются и заменяются на соответствующе отформатированные данные на основе заданного значения. Любой текст, который не является шаблонным образцом, просто копируется без изменений. Аналогично, в шаблонной строке ввода (для других функций) шаблонные образцы определяют значения, которые должны быть предоставлены входной строкой данных. Если в шаблонной строке есть символы, которые не являются шаблонными образцами, соответствующие символы во входной строке данных просто пропускаются (независимо от того, равны ли они символам в шаблонной строке).
Таблица 9.27 показывает доступные шаблоны для форматирования значений даты и времени.
Таблица 9.27. Шаблоны форматирования даты/времени
Шаблон | Описание |
---|---|
HH | час дня (01–12) |
HH12 | час дня (01–12) |
HH24 | час дня (00–23) |
MI | минута (00–59) |
SS | секунда (00–59) |
MS | миллисекунда (000–999) |
US | микросекунда (000000–999999) |
FF1 | десятая доли секунды (0–9) |
FF2 | сотая доли секунды (00–99) |
FF3 | millisecond (000–999) |
FF4 | десятая доли миллисекунды (0000–9999) |
FF5 | сотая доли миллисекунды (00000–99999) |
FF6 | микросекунда (000000–999999) |
SSSS , SSSSS | секунды после полуночи (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 | индикатор эпохи (без точек) |
BC , bc ,
AD или ad | индикатор эпохи (с точками) |
MONTH | полное название месяца в верхнем регистре (заполнено пробелами до 9 символов) |
Month | полное название месяца с заглавной буквы (заполнено пробелами до 9 символов) |
month | полное название месяца в нижнем регистре (заполнено пробелами до 9 символов) |
MON | сокращенное название месяца в верхнем регистре (3 символа на английском языке, локализованная длина может отличаться) |
Mon | сокращенное название месяца с заглавной буквы (3 символа на английском языке, локализованная длина может отличаться) |
mon | сокращенное название месяца в нижнем регистре (3 символа на английском языке, локализованная длина может отличаться) |
MM | номер месяца (01–12) |
DAY | полное название дня в верхнем регистре (заполнено пробелами до 9 символов) |
Day | полное название дня с заглавной буквы (заполнено пробелами до 9 символов) |
day | полное название дня в нижнем регистре (заполнено пробелами до 9 символов) |
DY | сокращенное название дня в верхнем регистре (3 символа на английском языке, локализованная длина может отличаться) |
Day | сокращенное написание дня с заглавной буквы (3 символа на английском языке, локализованная длина может отличаться) |
dy | сокращенное название дня недели в нижнем регистре (3 символа на английском языке, локализованная длина может отличаться) |
DDD | день года (001–366) |
IDDD | день недели в году, согласно нумерации недель ISO 8601 (001–371; первый день года - понедельник первой недели 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 г. до н.э. в полночь местного времени; см. Раздел B.7) |
Q | quarter |
RM | месяц в верхнем регистре римских цифр (I–XII; I=Январь) |
rm | месяц в нижнем регистре римских цифр (i–xii; i=январь) |
TZ | аббревиатура временной зоны в верхнем регистре
(поддерживается только в функции to_char ) |
tz | аббревиатура часового пояса в нижнем регистре
(поддерживается только в функции to_char ) |
TZH | часовой пояс |
TZM | минуты часового пояса |
OF | смещение часового пояса от UTC
(поддерживается только в функции to_char ) |
Модификаторы могут быть применены к любому шаблону для изменения его поведения. Например, FMMonth
- это шаблон Month
с модификатором FM
. Таблица 9.28 показывает модификаторы для форматирования даты/времени.
Таблица 9.28. Модификаторы шаблона для форматирования даты/времени
Модификатор | Описание | Пример |
---|---|---|
FM префикс | режим заполнения (подавление ведущих нулей и заполнительных пробелов) | FMMonth |
TH суффикс | суффикс верхнего регистра порядкового числа | DDTH , например, 12TH |
th суффикс | суффикс порядкового числа в нижнем регистре | DDth , например, 12th |
FX префикс | фиксированный формат глобальной опции (см. примечания по использованию) | FX Month DD Day |
TM префикс | режим перевода (использовать локализованные названия дней и месяцев на основе lc_time) | TMMonth |
SP суффикс | режим проверки орфографии (не реализован) | DDSP |
Примечания по использованию форматирования даты/времени:
FM
подавляет ведущие нули и конечные пробелы, которые в противном случае добавляются для создания фиксированной ширины вывода шаблона. В Tantor SE-1C,FM
изменяет только следующую спецификацию, в то время как в OracleFM
влияет на все последующие спецификации, и повторяющиеся модификаторыFM
переключают режим заполнения вкл./выкл.TM
подавляет конечные пробелы, независимо от того, указан лиFM
.to_timestamp
иto_date
игнорируйте регистр букв во входных данных; так, например,MON
,Mon
, иmon
принимают одинаковые строки. При использовании модификатораTM
регистр букв приводится к нижнему регистру в соответствии с правилами сортировки входных данных функции (см. Раздел 22.2).to_timestamp
иto_date
пропускайте несколько пробелов в начале входной строки и вокруг значений даты и времени, если не используется опцияFX
. Например,to_timestamp(' 2000 JUN', 'YYYY MON')
иto_timestamp('2000 - JUN', 'YYYY-MON')
работают, ноto_timestamp('2000 JUN', 'FXYYYY MON')
возвращает ошибку, потому чтоto_timestamp
ожидает только один пробел.FX
должно быть указано первым элементом в шаблоне.В разделителе (пробеле или символе, не являющемся буквой или цифрой) в строке шаблона функций
to_timestamp
иto_date
совпадает с любым одиночным разделителем во входной строке или пропускается, если не используется опцияFX
. Например,to_timestamp('2000JUN', 'YYYY///MON')
иto_timestamp('2000/JUN', 'YYYY MON')
работают, ноto_timestamp('2000//JUN', 'YYYY/MON')
вызывает ошибку, потому что количество разделителей во входной строке превышает количество разделителей в шаблоне.Если указано
FX
, разделитель в строке шаблона соответствует ровно одному символу во входной строке. Однако следует отметить, что символ входной строки не обязательно должен быть таким же, как разделитель в строке шаблона. Например,to_timestamp('2000/JUN', 'FXYYYY MON')
работает, ноto_timestamp('2000/JUN', 'FXYYYY MON')
возвращает ошибку, потому что второй пробел в строке шаблона потребляет буквуJ
из входной строки.A
TZH
шаблонный образец может соответствовать знаковому числу. Без опцииFX
, минусы могут быть неоднозначными и могут быть интерпретированы как разделитель. Эта неоднозначность разрешается следующим образом: если количество разделителей передTZH
в строке шаблона меньше количества разделителей перед минусом во входной строке, минус будет интерпретирован как частьTZH
. В противном случае минус будет считаться разделителем между значениями. Например,to_timestamp('2000 -10', 'YYYY TZH')
соответствует-10
TZH
, ноto_timestamp('2000 -10', 'YYYY TZH')
соответствует10
TZH
.В шаблонах функции
to_char
допускается использование обычного текста, который будет выведен буквально. Вы можете поместить подстроку в двойные кавычки, чтобы заставить ее интерпретироваться как буквальный текст, даже если она содержит шаблонные образцы. Например, в'"Hello Year "YYYY'
символыYYYY
будут заменены данными о годе, но один символY
в словеYear
не будет заменен. В функцияхto_date
,to_number
иto_timestamp
буквальный текст и текст, заключенный в двойные кавычки, приводят к пропуску количества символов, содержащихся в строке; например,"XX"
пропускает два входных символа (независимо от того, являются ли ониXX
или нет).Подсказка
До версии PostgreSQL 12 была возможность пропускать произвольный текст во входной строке с использованием символов, не являющихся буквами или цифрами. Например,
to_timestamp('2000y6m1d', 'yyyy-MM-DD')
раньше работало. Теперь вы можете использовать только буквенные символы для этой цели. Например,to_timestamp('2000y6m1d', 'yyyytMMtDDt')
иto_timestamp('2000y6m1d', 'yyyy"y"MM"m"DD"d"')
пропускаютy
,m
иd
.Если нужно иметь двойные кавычки в выводе, вы должны предварить их обратной косой чертой, например
'\"YYYY Month\"'
. Обратные косые черты вне двойных кавычек не имеют особого значения. Внутри двойных кавычек обратная косая черта воспринимается буквально, независимо от его значения (но это не имеет особого эффекта, если следующий символ - это двойная кавычка или еще одна обратная косая черта).В функциях
to_timestamp
иto_date
, если формат года указан с меньшим количеством цифр, например,YYY
, и предоставленный год содержит меньше четырех цифр, год будет скорректирован, чтобы быть ближайшим к году 2020, например,95
станет 1995.В функциях
to_timestamp
иto_date
отрицательные годы рассматриваются как обозначение до нашей эры (BC). Если вы указываете отрицательный год и явное полеBC
, то получаете снова год нашей эры (AD). Ввод года нуль рассматривается как 1 год до нашей эры (BC).В
to_timestamp
иto_date
, преобразованиеYYYY
имеет ограничение при обработке лет с более чем 4 цифрами. Вы должны использовать какой-либо нецифровой символ или шаблон послеYYYY
, иначе год всегда интерпретируется как 4-значный. Например (с годом 20000):to_date('200001130', 'YYYYMMDD')
будет интерпретироваться как 4-значный год; вместо этого используйте нецифровой разделитель после года, напримерto_date('20000-1130', 'YYYY-MMDD')
илиto_date('20000Nov30', 'YYYYMonDD')
.В функциях
to_timestamp
иto_date
поле CC (век) принимается, но игнорируется, если присутствует полеYYY
,YYYY
илиY,YYY
. ЕслиCC
используется сYY
илиY
, то результатом будет год в указанном веке. Если указан век, но не указан год, то предполагается первый год века.В функциях
to_timestamp
иto_date
принимаются имена или номера дней недели (DAY
,D
и связанные типы полей), но они игнорируются при вычислении результата. То же самое относится к кварталам (Q
).В функциях
to_timestamp
иto_date
можно указать дату с номером недели в соответствии с ISO 8601 (в отличие от григорианской даты) двумя способами:Год, номер недели и день недели: например,
to_date('2006-42-4', 'IYYY-IW-ID')
возвращает дату2006-10-19
. Если вы опустите день недели, предполагается, что это 1 (понедельник).Год и день года: например,
to_date('2006-291', 'IYYY-IDDD')
также возвращает2006-10-19
.
Попытка ввода даты, используя смесь полей недели, нумерации по стандарту ISO 8601 и полей даты по григорианскому календарю, является бессмысленной и вызовет ошибку. В контексте года, нумеруемого по стандарту ISO 8601, понятие "месяц" или "день месяца" не имеет смысла. В контексте григорианского года, неделя по стандарту ISO не имеет смысла.
Предостережение
В то время как функция
to_date
отклонит смесь григорианской и ISO недельной нумерации даты, функцияto_char
этого не сделает, так как формат вывода спецификации, такие какYYYY-MM-DD (IYYY-IDDD)
, могут быть полезными. Но избегайте написания чего-то вродеIYYY-MM-DD
; это приведет к неожиданным результатам в начале года. (См. Раздел 9.9.1 для получения дополнительной информации).В функции
to_timestamp
, миллисекунды (MS
) или микросекунды (US
) используются в качестве десятичных долей секунд. Например,to_timestamp('12.3', 'SS.MS')
не означает 3 миллисекунды, а 300, потому что преобразование интерпретирует это как 12 + 0.3 секунды. Таким образом, для форматаSS.MS
значения ввода12.3
,12.30
и12.300
указывают на одно и то же количество миллисекунд. Чтобы получить три миллисекунды, нужно написать12.003
, что преобразование интерпретирует как 12 + 0.003 = 12.003 секунды.Вот более сложный пример:
to_timestamp('15:12:02.020.001230', 'HH24:MI:SS.MS.US')
составляет 15 часов, 12 минут, 2 секунды + 20 миллисекунд + 1230 микросекунд = 2.021230 секунды.to_char(..., 'ID')
номер дня недели соответствует функцииextract(isodow from ...)
, но номер дня недели функцииto_char(..., 'D')
не соответствует номеру дня функцииextract(dow from ...)
.to_char(interval)
форматируетHH
иHH12
как показано на 12-часовых часах, например, ноль часов и 36 часов оба выводятся как12
, в то время какHH24
выводит полное значение часа, которое может превышать 23 в значенииinterval
.
Таблица 9.29 показывает доступные шаблоны для форматирования числовых значений.
Таблица 9.29. Шаблоны форматирования чисел
Шаблон | Описание |
---|---|
9 | позиция цифры (можно опустить, если незначительна) |
0 | позиция цифры (не будет удалена, даже если незначительна) |
. (точка) | десятичная точка |
, (запятая) | разделитель групп (тысяч) |
PR | отрицательное значение в угловых скобках |
S | знак привязан к числу (использует локаль) |
L | символ валюты (использует локаль) |
D | десятичная точка (использует локальные настройки) |
G | разделитель группы (использует локаль) |
MI | минусовой знак в указанной позиции (если число < 0) |
PL | знак плюс на указанной позиции (если число > 0) |
SG | знак плюс/минус в указанной позиции |
RN | Римское число (вводится от 1 до 3999) |
TH или th | суффикс порядкового числа |
V | сдвигает указанное количество цифр (см. примечания) |
EEEE | показатель для научной нотации |
Примечания по использованию числового форматирования:
0
указывает позицию цифры, которая всегда будет печататься, даже если она содержит ведущий/заключительный ноль.9
также указывает позицию цифры, но если это ведущий ноль, то он будет заменен пробелом, а если это заключительный ноль и задан режим заполнения, то он будет удален. (Дляto_number()
эти два символа шаблона эквивалентны).Если формат предоставляет меньше дробных цифр, чем число, которое форматируется,
to_char()
округлит число до указанного количества дробных цифр.Символы шаблона
S
,L
,D
иG
представляют знак, символ валюты, десятичную точку и разделитель тысяч, определенные текущей локалью (см. lc_monetary и lc_numeric). Символы шаблона точка и запятая представляют собой точно эти символы с значениями десятичной точки и разделителя тысяч, независимо от локали.Если в шаблоне функции
to_char()
не указано явное положение знака, то одна колонка будет зарезервирована для знака и он будет привязан к числу (появится слева от числа). ЕслиS
находится слева от некоторых9
, то он также будет привязан к числу.Знак, отформатированный с использованием
SG
,PL
илиMI
, не привязан к числу; например,to_char(-12, 'MI9999')
выводит'- 12'
, аto_char(-12, 'S9999')
выводит' -12'
. (В реализации Oracle не разрешается использованиеMI
перед9
, а требуется, чтобы9
предшествовалMI
).TH
не преобразует значения меньше нуля и не преобразует дробные числа.PL
,SG
иTH
- это расширения Tantor SE-1C.В функции
to_number
, если используются шаблоны, не являющиеся данными, такие какL
илиTH
, соответствующее количество входных символов пропускается, независимо от того, соответствуют ли они шаблону, если они не являются данными символами (то есть цифры, знак, десятичная точка или запятая). Например,TH
пропустит два символа, не являющихся данными.V
сto_char
умножает входные значения на10^
, гдеn
n
- количество цифр послеV
.V
сto_number
делит аналогичным образом.to_char
иto_number
не поддерживают использованиеV
в сочетании с десятичной точкой (например,99.9V99
не разрешено).EEEE
(научная нотация) не может использоваться в сочетании с любыми другими шаблонами или модификаторами форматирования, кроме шаблонов для цифр и десятичной точки, и должна находиться в конце строки формата (например,9.99EEEE
является допустимым шаблоном).
Некоторые модификаторы могут быть применены к любому шаблону для изменения его поведения. Например, FM99.99
- это шаблон 99.99
с модификатором FM
. Таблица 9.30 показывает модификаторы для числового форматирования.
Таблица 9.30. Шаблонные модификаторы для числового форматирования
Модификатор | Описание | Пример |
---|---|---|
FM префикс | режим заполнения (подавление конечных нулей и заполнительных пробелов) | FM99.99 |
TH суффикс | суффикс верхнего регистра порядкового числа | 999TH |
th суффикс | суффикс порядкового числа в нижнем регистре | 999th |
Таблица 9.31 показывает некоторые примеры использования функции to_char
.
Таблица 9.31. to_char
Примеры
Выражение | Результат |
---|---|
to_char(current_timestamp, 'День, DD HH12:MI:SS') | 'Вторник , 06 05:39:18' |
to_char(current_timestamp, 'FMDay, FMDD HH12:MI:SS') | 'Вторник, 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' |