Шаг 71 - PL/SQL - функции, преобразования TO_CHAR(...) даты

В прошлый раз мы рассмотрели уже достаточно большое количество функций, для работы с разнообразными данными в среде 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!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 16.11.2003