Данный Digital Q.DataBase функции форматирования предоставляют мощный набор инструментов для преобразования различных типов данных (дата/время, целые числа, числа с плавающей запятой, числовые типы) в отформатированные строки и для обратного преобразования из отформатированных строк в конкретные типы данных. Таблица 2.6.26 содержит их список. Для всех этих функций принято общее соглашение о вызовах: первым аргументом является форматируемое значение, а вторым — шаблон, определяющий формат выходных или входных данных.
Таблица 2.6.26. Функции форматирования
Функция Описание Примеры |
|---|
Функция преобразует значение типа timestamp в строку согласно заданному формату.
|
Функция преобразует значение типа interval в строку согласно заданному формату.
|
Функция преобразует числовое значение в строку согласно заданному формату; доступно
в
|
|
Функция преобразует строку в значение типа date согласно заданному формату.
|
Функция преобразует строку в числовое значение типа numeric согласно заданному формату.
|
Функция преобразует строку в значение типа timestamp согласно заданному формату.
(См. также
|
to_timestamp и to_date
существуют для обработки форматов входных данных, которые не могут быть преобразованы путем простого приведения типов. Для большинства стандартных форматов даты и времени обычное приведение исходной строки к требуемому типу данных работает корректно и является гораздо более простым способом. Аналогично, to_number не требуется для стандартных числовых представлений.
В to_char выходной шаблонной строке определенные шаблоны распознаются и заменяются соответствующим образом отформатированными данными на основе заданного значения. Любой текст, не являющийся шаблоном, просто копируется дословно. Аналогично, в шаблонной строке ввода (для других функций) шаблоны определяют значения, которые должны быть получены из входной строки данных. Если в шаблонной строке присутствуют символы, не являющиеся шаблонами, соответствующие символы во входной строке данных просто пропускаются (независимо от того, совпадают ли они с символами шаблонной строки).
Таблица 2.6.27 приведены шаблоны, доступные для форматирования значений даты и времени.
Таблица 2.6.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 | миллисекунда (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 | последние три цифры номера года |
YY | последние две цифры номера года |
Y | последняя цифра номера года |
IYYY | номер года согласно стандарту ISO 8601 (4 или более цифр) |
IYY | последние три цифры номера года согласно стандарту ISO 8601 |
IY | последние две цифры номера года согласно стандарту 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; первым днем года является понедельник первой недели ISO) |
DD | день месяца (01–31) |
D | день недели, от воскресенья (1) до субботы (7) |
ID | день недели по стандарту ISO 8601, от понедельника (1) до воскресенья (7) |
W | номер недели месяца (1–5); первая неделя начинается с первого числа месяца |
WW | номер недели года (1–53); первая неделя начинается с первого дня года |
IW | номер недели в году по стандарту ISO 8601 (01–53); первой неделей года считается неделя, содержащая первый четверг года |
CC | век (2 цифры) (двадцать первый век начинается 2001-01-01) |
J | юлианская дата (целое количество дней с 24 ноября 4714 г. до н. э. по местному времени (полночь); см. Раздел 8.2.7) |
Q | квартал |
RM | номер месяца римскими цифрами в верхнем регистре (I–XII; I=январь) |
rm | номер месяца римскими цифрами в нижнем регистре (i–xii; i=январь) |
TZ | аббревиатура часового пояса в верхнем регистре |
tz | аббревиатура часового пояса в нижнем регистре |
TZH | часы часового пояса |
TZM | минуты смещения часового пояса |
OF | смещение часового пояса относительно UTC (HH
или HH:MM) |
Для изменения поведения к любому шаблону можно применить модификаторы. Например, FMMonth
представляет собой Month шаблон с
FM модификатором.
Таблица 2.6.28 приведены шаблоны модификаторов для форматирования даты и времени.
Таблица 2.6.28. Модификаторы шаблонов для форматирования даты и времени
| Модификатор | Описание | Пример |
|---|---|---|
FM префикс | режим заполнения (удаление ведущих нулей и дополняющих пробелов) | FMMonth |
TH суффикс | суффикс порядкового числительного в верхнем регистре | DDTH, например, 12TH |
th суффикс | суффикс порядкового числительного в нижнем регистре | DDth, например, 12th |
FX префикс | глобальный параметр фиксированного формата (см. примечания по использованию) | FX Month DD Day |
TM префикс | режим перевода (использование локализованных названий дней и месяцев на основе lc_time) | TMMonth |
SP суффикс | режим прописи (не реализовано) | DDSP |
Примечания по форматированию даты и времени:
FM подавление ведущих нулей и завершающих пробелов
который в противном случае был бы добавлен для приведения результата по шаблону к
фиксированной ширине. В Digital Q.DataBase,
FM модифицирует только следующую спецификацию, тогда как в
Oracle FM влияет на все последующие
спецификации, а повторяющиеся FM модификаторы
переключают режим заполнения.
TM подавляет завершающие пробелы независимо от того, был ли
NOT FM указан.
to_timestamp и to_date
игнорировать регистр символов во входных данных; так, например,
пример MON, Mon,
и mon все принимают одни и те же строки. При использовании
с TM модификатора приведение регистра выполняется согласно
правилам правила сортировки (collation) входных данных функции (см.
Раздел 3.8.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
который выводится буквально. Подстроку можно заключить
в двойные кавычки для ее принудительной интерпретации как литерального текста,
даже если она содержит элементы шаблона. Например, в строке
'"HelloYear "YYYY', оператор YYYY
будет заменено значением года, тогда как слово Y в Year
заменено не будет.
В to_date, to_number,
и to_timestamp, литеральный текст и строки в двойных кавычках
приводят к пропуску того количества символов, которое содержится в
строка; например "XX" пропускает два входных символа
(независимо от того, являются ли они XX).
До версии Digital Q.DataBase 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,
если спецификация формата года содержит менее четырех цифр (например, YY)
YYY, а во входных данных год представлен менее чем четырьмя цифрами,
значение года будет приведено к ближайшему к 2020 году; так,
95 преобразуется в 1995.
В to_timestamp и to_date,
отрицательные значения года интерпретируются как годы до н. э. (BC). Если указать одновременно
отрицательный год и явно задать BC соответствующее поле, в результате снова получится значение н. э. (AD)
again. Входное значение года 0 интерпретируется как 1 год до н. э. (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 поле век (century) принимается, но игнорируется,
если присутствует YYY, YYYY или
Y,YYY поле. Если CC используется совместно с
YY или Y тогда результат
вычисляется как указанный год в заданном веке. Если век
указан, а год нет, то результатом считается первый год этого века
считается принятым по умолчанию.
В to_timestamp и to_date,
названия или номера дней недели (DAY, D,
и связанные с ними типы полей) допускаются, но игнорируются при
вычислении результата. Это же правило применяется и к полям кварталов
(Q) fields.
В 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 понятие «month» или «дня месяца» не имеет смысла. В контексте григорианского года неделя ISO не имеет смысла.
В то время как функция to_date будет отклонять сочетание
полей даты григорианского календаря и нумерации недель ISO,
полей, to_char не будет этого делать, так как такие спецификации
формата вывода, как YYYY-MM-DD (IYYY-IDDD) могут быть
полезны. Однако следует избегать написания конструкций вида IYYY-MM-DD;
это приведет к получению неожиданных результатов в начале года.
(См. Раздел 2.6.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 секунды.
шаблона 'ID' функции to_char(...)нумерация дней недели
соответствует extract(isodow from ...) , однако
шаблона 'D' функции to_char(...)не соответствует
extract(dow from ...)нумерации дней.
to_char(interval) форматирует значения HH и
HH12 согласно 12-часовому циклу, например, для нулевого часа
и 36 часов выводятся в виде 12, тогда как HH24
выводит полное количество часов, значение которого может превышать 23 в
символ ASCII. interval значении.
Таблица 2.6.29 показывает шаблоны, доступные для форматирования числовых значений.
Таблица 2.6.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символов '9',
он так же будет привязан к числу.
Знак, отформатированный с использованием спецификатора, SG, PLили
MI не привязывается к
числу; например,
to_char(-12, 'MI9999') выдает результат '- 12'
тогда как to_char(-12, 'S9999') выдает результат ' -12'.
(Реализация в Oracle не позволяет использовать спецификатор
MI перед 9, а напротив,
требует, чтобы 9 предшествуют
MI.)
TH не преобразует значения меньше нуля
и не преобразует дробные числа.
PL, SG, а символ
TH являются Digital Q.DataBase
расширениями.
В to_number, если используются такие шаблоны, не представляющие данные, как
функции L или TH то
пропускается соответствующее количество входных символов независимо от того,
соответствуют ли они шаблону, если только они не являются символами данных
(то есть цифрами, знаком, десятичной точкой или запятой). Например,
например, TH будут пропущены два символа, не являющихся данными.
V с to_char
умножает входные значения на
10^, где
nn — это количество цифр, следующих за
V. V на
to_number выполняет деление аналогичным образом.
to_char и to_number
не поддерживают использование
V в сочетании с десятичной точкой
(например, 99.9V99 не допускается).
EEEE (научная нотация) не может быть использована в
сочетании с любыми другими шаблонами форматирования или
модификаторами, за исключением шаблонов цифр и десятичной точки, и должна располагаться в конце строки форматирования
(например, 9.99EEEE является допустимым шаблоном).
К любому шаблону можно применить определенные модификаторы для изменения его поведения. Например, FM99.99
представляет собой 99.99 шаблон с
FM модификатором.
Таблица 2.6.30 демонстрирует шаблоны модификаторов для форматирования чисел.
Таблица 2.6.30. Модификаторы шаблонов для форматирования чисел
| Модификатор | Описание | Пример |
|---|---|---|
FM префикс | режим заполнения (подавление завершающих нулей и дополняющих пробелов) | FM99.99 |
TH суффикс | суффикс порядкового числительного в верхнем регистре | 999TH |
th суффикс | суффикс порядкового числительного в нижнем регистре | 999th |
Таблица 2.6.31 в таблице приведены некоторые примеры использования to_char function.
Таблица 2.6.31. 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(current_timestamp AT TIME ZONE
'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') | '2022-12-06T05:39:18Z',
ISO Расширенный формат 8601 |
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' |