В прошлый раз мы рассмотрели уже достаточно большое количество функций, для работы с разнообразными данными в среде PL/SQL. А, вот сейчас пришло-таки время внимательнее рассмотреть те самые функции преобразования, с которыми мы с вами уже сталкивались, еще в самом начале пути. Итак, что же это за функции и как они устроены. Как правило, при работе с разными типами данных PL/SQL сам неявно вызывает функции преобразования и вам не приходиться самим что-то делать. Но PL/SQL использует их, с типом преобразования по умолчанию. Например, запишем такой блок:
SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.put_line(SYSDATE); END; /
Получаем:
SQL> SET SERVEROUTPUT ON SQL> SQL> BEGIN 2 3 DBMS_OUTPUT.put_line(SYSDATE); 4 5 END; 6 / 16.11.03 Процедура PL/SQL успешно завершена.
Такой, тип вывода нас не всегда устраивает, по этому у функции TO_CHAR есть множество форматов вывода данных, которые можно применять используя явное преобразование или, проще говоря, ее вызов. Функция TO_CHAR имеет следующий синтаксис:
TO_CHAR(d, [, формат [nls_параметр]])
Где d, это данные типа DATE, а "формат" - это строка, которая состоит из нескольких или одного элементов, описанных ниже в таблице. При этом, если "формат" не указан, то как вы помните, используется формат по умолчанию для конкретного сеанса. "nls_параметр" - управляет выбором языка, но, как правило, достаточно языка по умолчанию, например я этот параметр использовал очень редко. Далее можете посмотреть на таблицу форматов и пример с применением данных из таблицы.
Элемент формата дат | Описание |
---|---|
Знак пунктуации | Все знаки пунктуации дублируются в результирующей строке символов |
"Текст" | Текст, заключенный в двойные кавычки так же дублируется |
AD, A.D. | Показатель "нашей эры" (с точками или без точек.) |
AM, A.M. | Показатель времени до полудня (с точками или без точек.) |
BC, B.C. | Показатель "до нашей эры" (с точками или без точек.) |
CC, SCC | Век SCC возвращает даты "до нашей эры" как отрицательные значения |
D | День недели (1-7) |
DAY | Название дня, дополненное пробелами до девяти символов. * |
DD | День месяца (1 - 31) |
DDD | День года (1 - 366) |
DY | Сокращенное название дня. * |
IW | Неделя года (1 - 52), (1 - 53) (в основе лежит стандарт ISO) |
IYY, IY, I | Последние три, две или одна цифра года ISO |
IYYY | Четырех цифровое обозначение года, основанное на стандарте ISO |
HH, HH12 | Час дня (1-12) |
HH24 | Час дня (0-23) |
J | День по Юлианскому календарю. Число дней с 1 января 4712 года до н.э. Соответствующий результат будет целым значением. |
MI | Минута (0-59) |
MM | Месяц (1 - 12), JAN = 1, DEC = 12 |
MONTH | Название месяца, дополненное пробелами до девяти символов. * |
MON | Сокращенное название месяца. * |
PM P.M. | Показатель времени после полудня (с точками или без точек.) |
Q | Квартал года (1 - 4) С января по март - первый квартал. |
RM | Месяц, обозначенный римскими цифрами. (I - XII) JAN = I, DEC = XII |
RR | Последние две цифры года для других веков. |
SS | Секунды (0-59) |
SSSS | Секунды после полуночи (0 - 86399) Модель формата 'J.SSSSS' всегда будет давать в результате числовое значение. |
WW | Неделя года (1-53). Неделя 1 начинается с первого дня года и продолжается до седьмого дня. таким образом, недели не всегда начинаются с воскресенья как это принято в США, это что то вроде сквозного недельного отсчета. |
W | Неделя месяца (1-5) Недели определяются, так же как и WW! |
Y, YYY | Год с запятой в указанной позиции. |
YEAR, SYEAR | Год, записанный буквами, SYEAR возвращает даты до нашей эры как отрицательные значения. * |
YYYY, SYYYY | Четырех цифровой год. Возвращает даты до нашей эры как отрицательные значения. |
YYY, YY, Y | Последние три, две или одна цифра года. |
Вот блок примера, где я постарался применить разнообразные форматы вывода функции TO_CHAR(). Для получения данных с типом DATE я применил функцию SYSDATE, с которой вы уже знакомы:
SET SERVEROUTPUT ON BEGIN -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MM-YY')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MM-YYYY A.D.')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-J-MM-YYYY A.D.')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'D-DAY-DD-MON, YYYY')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DAY DDD MONTH YYYY')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DAY-MONTH-YYYY')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'Q-DD-RM-YYYY ')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-WW-YYYY HH24:MI:SS')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-W-YYYY HH24:MI:SS')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-YEAR HH24:MI:SS')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH24:MI:SS')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH:MI:SS AM')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH12:MI:SS P.M.')); -- Function TO_CHAR() -- DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH12:MI:SS:J.SSSSS P.M.')); END; /
После SQL*Plus получаем:
SQL> BEGIN 2 3 -- Function TO_CHAR() -- 4 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MM-YY')); 5 6 -- Function TO_CHAR() -- 7 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MM-YYYY A.D.')); 8 9 -- Function TO_CHAR() -- 10 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-J-MM-YYYY A.D.')); 11 12 -- Function TO_CHAR() -- 13 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'D-DAY-DD-MON, YYYY')); 14 15 -- Function TO_CHAR() -- 16 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DAY DDD MONTH YYYY')); 17 18 -- Function TO_CHAR() -- 19 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DAY-MONTH-YYYY')); 20 21 -- Function TO_CHAR() -- 22 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'Q-DD-RM-YYYY ')); 23 24 -- Function TO_CHAR() -- 25 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-WW-YYYY HH24:MI:SS')); 26 27 -- Function TO_CHAR() -- 28 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-W-YYYY HH24:MI:SS')); 29 30 -- Function TO_CHAR() -- 31 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'DD-MONTH-YEAR HH24:MI:SS')); 32 33 -- Function TO_CHAR() -- 34 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH24:MI:SS')); 35 36 -- Function TO_CHAR() -- 37 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH:MI:SS AM')); 38 39 -- Function TO_CHAR() -- 40 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH12:MI:SS P.M.')); 41 42 -- Function TO_CHAR() -- 43 DBMS_OUTPUT.put_line( TO_CHAR(SYSDATE, 'HH12:MI:SS:J.SSSSS P.M.')); 44 45 END; 46 / 16-11-03 16-11-2003 Н.З. 16-2452960-11-2003 Н.З. 7-ВОСКРЕСЕНЬЕ-16-НОЯ, 2003 ВОСКРЕСЕНЬЕ 320 НОЯБРЬ 2003 ВОСКРЕСЕНЬЕ-НОЯБРЬ -2003 4-16-XI -2003 16-НОЯБРЬ -46-2003 13:13:14 16-НОЯБРЬ -3-2003 13:13:14 16-НОЯБРЬ -TWO THOUSAND THREE 13:13:14 13:13:14 01:13:14 PM 01:13:14 PM 01:13:14:2452960.47594 PM Процедура PL/SQL успешно завершена.
Вот таким образом можно, применяя разнообразные форматы вывода, получать необходимую для работы структуру данных.
Для некоторых форматов при преобразовании дат есть чувствительность к регистру (они в таблице имеют значок *). Например, функция MON вернет JAN, а если записать Mon, то получите Jan!