Преобразование значимого выражения в символьное представление

Функция

Преобразование числового значения или значения типа «дата» из внутреннего представления в символьное.

Спецификация
 
< NLS-спецификация >::=
< NLS_NUMERIC_CHARACTERS >::=
'NLS_NUMERIC_CHARACTERS=символьный литерал'
< NLS_DATE_LANGUAGE >::=
'NLS_DATE_LANGUAGE={RUSSIAN | ENGLISH}'
< символьный формат >::=
Синтаксические правила
  1. < Числовое выражение > должно иметь значение типа SMALLINT, INTEGER, BIGINT, DECIMAL, REAL или DOUBLE.

  2. При необходимости производится преобразование числового аргумента к типу данных DECIMAL.

  3. При первом параметре функции to_char типа DATE при работе в режиме /COMPATIBILITY=ORACLE посторонние алфавитно-цифровые символы в строке формата при форматном выводе значений даты и времени вызывают выдачу кода завершения. При работе в прочих режимах /COMPATIBILITY эти символы копируются в выходную строку, без выдачи кода завершения.

    Примечание

    Ключ /COMPATIBILITY=ORACLE поддерживается со сборки 6.0.17.92.

  4. < Выражение типа «дата-время» > должно иметь значение типа DATE.

  5. Аргументы функции могут быть заданы < SQL-параметром >.

    select to_char(? (int)), to_char(:param (date), ?);
    +451
    12/02/2015
    MM/DD/YYYY
    |451        |12/02/2015|
  6. Для числовых значений < символьный формат > может содержать следующие элементы:

    • S – позиция для знака, должна быть одна в начале или в конце, выводятся и плюс и минус. При указании модификатора знак + выводится, в противном случае – нет. Для отрицательных чисел знак числа выводится всегда, независимо от присутствия или отсутствия в шаблоне модификатора S, для целых чисел нули после точки не формируются. Если в формате для строкового преобразования числа нет позиции для знака S, то в режиме /COMPATIBILITY=STANDARD автоматически добавляется одна позиция в длину результата, а в обычном режиме не добавляется (если знак из-за этого не помещается, выдается признак ошибки - заполнение символами '*');

    • 9 – позиция для цифры. Ведущие нули не выводятся за исключением числа 0;

    • 0 – позиция для цифры с обязательным выводом ведущих или концевых нулей;

    • . – позиция для десятичной точки (должна быть одна);

    • D – позиция для десятичной точки или ее заменителя, который берется из параметра NLS_NUMERIC_CHARACTER;

    • , – позиция для разделителя-запятой, не может быть первой или идти после десятичной точки;

    • G – позиция для разделителя-запятой или ее заменителя, который берется из параметра NLS_NUMERIC_CHARACTER;

    • FM – признак «плотного вывода». Усекаются ведущие пробелы и концевые нули, т.е. вывод выравнивается по левой границе (по умолчанию это не делается и вывод в режиме /COMPATIBILITY=ORACLE выравнивается по правой границе);

    • EEEE – представление числа с мантиссой и порядком. Для данного формата не поддерживаются символы G и D, а также третий аргумент NLS_NUMERIC_CHARACTERS.

    select to_char(415000035);
    |415000035|
    
    select TO_CHAR (415000035,'999999999');
    |   415000035|
    
    select TO_CHAR (41500.0035,'999,999.999');
    |  41,500.004|
    
    select TO_CHAR (415000035,'S00999999999');
    |  +00415000035|
    
    select TO_CHAR (round(415000035,6),'9.99999999EEEE');
    |4.15000035E+08 |
    
    select to_char(1.0e0/3,'9.9999999999EEEE');
    |3.333333333333330000000000000000E-01 |
    
    SELECT TO_CHAR(415000035, 'FM99999999990D9999999'), TO_CHAR(415000035, '99999999990D9999999');
    |415000035.|   415000035.0000000|
  7. Форматы по умолчанию числовых типов:

     Тип данных Формат по умолчанию
     SMALLINT 99999
     INT 9999999999
     BIGINT 9999999999999999999
     REAL 99999999.99 (округление)
     DOUBLE 99999999.99 (округление)
     DECIMAL 99999999999999999999.9999999999
  8. < Символьный литерал > в опции NLS_NUMERIC_CHARACTERS задается в виде двух символов 'XY', где:

    • X – определяет символ, используемый для различения целой и дробной части числового значения (по умолчанию точка);

    • Y – определяет разделитель групп цифр числового значения (по умолчанию запятая).

    select TO_CHAR (9223372036857, '9999999G999G999D999999', 'NLS_NUMERIC_CHARACTERS=.,');
    | 9223372,036,857.000000|
    
    select TO_CHAR (9223372036857, '9999999G999G999D999999', 'NLS_NUMERIC_CHARACTERS=:;');
    | 9223372:036:857;000000|
    
    select TO_CHAR (-1231.5, 'S9G999D9999', 'NLS_NUMERIC_CHARACTERS=''|?''');
    | -1?231|5000|
  9. < Символьный формат > для < выражения типа «дата-время» > может содержать следующие элементы:

    • YYYY | IYYY – номер года (4 цифры);

    • YY | IY – номер года (2 последние цифры, диапазон 00-99);

    • Q – квартал года (1 для января-марта, 2 для апреля-июня, 3 для июля-сентября, 4 для октября-декабря);

    • MM – номер месяца в году (2 цифры, диапазон 01-12);

    • MON – сокращенное название месяца (3 буквы);

    • MONTH – полное название месяца (8 букв);

    • RM – вывод номера месяца римскими цифрами (I-XII);

    • J – номер дня по юлианскому календарю;

    • D – номер дня в неделе (1 цифра, диапазон 1-7);

    • DD – номер дня в месяце (2 цифры, диапазон 01-31);

    • DY – сокращенное название дня недели (3 буквы);

    • DAY – полное название дня недели (12 букв);

    • DDD – номер дня в году (3 цифры, диапазон 001-366);

    • HH12 – количество часов (2 цифры, диапазон 00-12), обычно комбинируется вместе с одним из форматов am, pm, AM, PM;

    • am, pm, AM, PM, a.m., p.m., A.M., P.M. – время до полудня (после полудня). A.M. автоматически заменяется на P.M. (и наоборот), в зависимости от заданного времени;

    • HH, HH24 – количество часов (2 цифры, диапазон 00-23);

    • MI – количество минут (2 цифры, диапазон 00-59);

    • SS – количество секунд (2 цифры, диапазон 00-59);

    • SSSSS – число секунд, прошедших от 00:00:00 текущих суток;

    • FF – количество тиков (2 цифры, диапазон 00-99);

    • FFF или MS – количество тысячных долей секунды (3 цифры) – только при использовании в функции TO_DATE, делится на 10 для перевода в тики.

    • FM – признак «плотного вывода» наименований дней недели и месяцев года (т. е. усекаются пробелы в конце имен). Применяется в виде префикса к шаблону полного дня недели или полного месяца года, т.е. FMDAY или FMMONTH.

    select to_char(to_date('21.03.2016', 'dd.mm.yyyy'), 'month', 'NLS_DATE_LANGUAGE=RUSSIAN' ) + '- месяц года.';
    |март    - месяц года.|
    
    select to_char(to_date('21.03.2016', 'dd.mm.yyyy'), 'fmmonth', 'NLS_DATE_LANGUAGE=RUSSIAN' ) + '- месяц года.';
    |март - месяц года.|

    Примечание

    Представление значений элементов формата нельзя усекать, т.е. номер месяца 2 надо записывать в виде 02.

  10. Запрещено использование в < символьном формате > для < выражения типа «дата-время» > цифр и латинских букв, которые не задают разрешенный формат вывода одного из компонентов даты.

  11. Входным форматом «дата-время» по умолчанию, который распознается автоматически (т.е. без указания формата преобразования), являются:

    • DD.MM.[YY]YY[:[HH:[MI:[SS.[FF]]]];

    • MM/DD/[YY]YY[:[HH:[MI:[SS.[FF]]]];

    • DD-MON-[YY]YY[:[HH:[MI:[SS.[FF]]]];

    • YYYY-MM-DD[:[HH:[MI:[SS.[FF]]]].

    Если символьные значения типа DATE представляются в ином виде, необходимо явно задавать формат преобразования.

    create table tab1(dt date);
    insert into tab1 values(sysdate);
    insert into tab1 values('28-apr-50');
    insert into tab1 values('28.04.51');
    insert into tab1 values('04/28/52');
    insert into tab1 values('28-apr-1953');
    insert into tab1 values(to_date('28|04|1954','dd|mm|yyyy'));
    
    select * from tab1;
    |30.04.2003:12:03:27.00 |
    |28.04.1950:00:00:00.00 |
    |28.04.1951:00:00:00.00 |
    |28.04.1952:00:00:00.00 |
    |28.04.1953:00:00:00.00 |
    |28.04.1954:00:00:00.00 |
    
    insert into tab1 values(to_date('23.10.1997:02:27:38:78', 'dd.mm.yyyy:hh:ss:mi:ff'));
    insert into tab1 values(to_date('23.10.1997:02:27:38:178', 'dd.mm.yyyy:hh:ss:mi:ms'));
    
    select to_char(dt, 'dd.mm.yyyy:hh:mi:ss:fff') from tab1;
    |23.10.1997:02:38:27:780|
    |23.10.1997:02:38:27:170|
    …
  12. Выходные символьные строки значений типа DATE по умолчанию (т.е. при отсутствии явно заданного формата преобразования) представляются всегда в виде DD.MM.YYYY:HH:MI:SS.FF.

    select sysdate;
    |30.04.2003:12:03:27.25|
  13. При конструировании формата преобразования допустимо использовать обозначения элементов формата, перечисленные выше, в любых комбинациях (кроме ограничений, накладываемых функцией TO_DATE) и задавать любые символы и/или строки символов, не совпадающие с обозначениями элементов формата, в качестве разделителей элементов формата. При распознавании формата регистр букв не различается, т.е. обозначения вида DD, dd, Dd и dD равнозначны. При использовании формата преобразуемое входное символьное значение должно в точности соответствовать формату:

     Символьное представление Формат
     16.02.1998:10:35 DD.MM.YYYY:HH:MI
     16.02.98:10:35 dd.mm.yy:HH:MI
     16-02-98 10:35 DD-mm-YY hh:mi
     10 час 30 мин 16/02/1998 HH час MI мин DD/MM/YYYY
     В год 2000 месяца 02 В год YYYY месяца MM
     дня 16 10.35.47 дня DD hh.mi.ss
     13.45.37 hh12.mi.ss a.m.
  14. При вводе года по формату YY к нему добавляется 2000, если значение меньше или равно 37, иначе – 1900. При выводе выдаются две последние цифры без каких-либо проверок.

  15. Третьим параметром для < выражения типа «дата-время» > является < NLS_DATE_LANGUAGE >. Значение третьего параметра определяет язык вывода названия месяцев и дней недели. Значение регистронезависимое, по умолчанию ENGLISH.

    select to_char(sysdate, 'dd mon iyyy day'),
           to_char(sysdate, 'dd mon iyyy day', 'NLS_DATE_LANGUAGE=russian'),
           to_char(sysdate, 'dd mon iyyy day', 'NLS_DATE_LANGUAGE=ENGLISH');
    |15 nov 2016 tuesday|15 ноя 2016 вторник|15 nov 2016 tuesday|
Возвращаемое значение
  1. Символьное представление < значимого выражения > осуществляется в соответствии с < символьным форматом > преобразования.

  2. Если формат представления недостаточен, выводится последовательность в виде *****.

  3. Формат вывода выражений CAST … AS CHAR для выражения типа DECIMAL (если количество значащих цифр после запятой меньше точности) зависит от ключа /COMPATIBILITY=STANDARD запуска ядра СУБД:

    • ключ задан – значение после запятой будет дополнено нулями до значения точности;

    • ключ не задан – значение после запятой не будет дополнено нулями до значения точности.

    Примеры.
    1) Ядро СУБД запущено с ключом /COMPATIBILITY=STANDARD:
    select cast (cast 1.5 as DECIMAL(15,3)) as char;
    |1.500 |
    
    2) Ядро СУБД запущено без ключа /COMPATIBILITY=STANDARD:
    select cast (cast 1.5 as DECIMAL(15,3)) as char;
    |1.5 |
Примеры

Пусть значение столбца dat будет 2 часа 27 минут 38 секунд 78 тиков 23 октября 1997, тогда:

to_char(dat) /* по умолчанию*/
|23-oct-97 |
to_char(dat,'dd-mm-yyyy/hh24:mi:ss')
|23-10-1997/02:27:38 |
to_char(dat,'Дата отчета: dd/mm/yy')
|Дата отчета: 23/10/97 |
to_char(dat,'hh24.mi')
|02.27 |
select sysdate, to_char(sysdate, 'hh12.mi.ss  a.m.');
|06.06.2003:14:07:14.00 |02.07.14  p.m. |