×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

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

Данный Digital Q.DataBase функции форматирования предоставляют мощный набор инструментов для преобразования различных типов данных (дата/время, целые числа, числа с плавающей запятой, числовые типы) в отформатированные строки и для обратного преобразования из отформатированных строк в конкретные типы данных. Таблица 2.6.26 содержит их список. Для всех этих функций принято общее соглашение о вызовах: первым аргументом является форматируемое значение, а вторым — шаблон, определяющий формат выходных или входных данных.

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

Функция

Описание

Примеры

to_char ( timestamp, text ) → text

to_char ( timestamp with time zone, text ) → text

Функция преобразует значение типа timestamp в строку согласно заданному формату.

to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS')05:31:12

to_char ( interval, text ) → text

Функция преобразует значение типа interval в строку согласно заданному формату.

to_char(interval '15h 2m 12s', 'HH24:MI:SS')15:02:12

to_char ( numeric_type, text ) → text

Функция преобразует числовое значение в строку согласно заданному формату; доступно в integer, bigint, numeric, real, double precision.

to_char(125, '999')125

to_char(125.8::real, '999D9')125.8

to_char(-125.8, '999D99S')125.80-

to_date ( text, text ) → date

Функция преобразует строку в значение типа date согласно заданному формату.

to_date('05 Dec 2000', 'DD Mon YYYY')2000-12-05

to_number ( text, text ) → numeric

Функция преобразует строку в числовое значение типа numeric согласно заданному формату.

to_number('12,454.8-', '99G999D9S')-12454.8

to_timestamp ( text, text ) → timestamp with time zone

Функция преобразует строку в значение типа timestamp согласно заданному формату. (См. также to_timestamp(double precision) в Таблица 2.6.33.)

to_timestamp('05 Dec 2000', 'DD Mon YYYY')2000-12-05 00:00:00-05


Подсказка

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^n, где n — это количество цифр, следующих за 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'

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению