Преобразование даты в строку в PL/SQL Oracle
Присвоить переменной значение типа даты/времени — только полдела. Еще нужно прочитать его и представить в понятной для человека форме. Для этого в Oracle существует функция TO_CHAR.
Функция TO_CHAR предназначена для преобразования значения даты/времени в строку переменной длины. Она применяется и для типа DATE, и для всех типов семейства TIMESTAMP. Синтаксис функции TO_CHAR:
FUNCTION TO_CHAR (входная_дата IN DATE [, маска IN VARCHAR2 [, язык_nls IN VARCHAR2]]) RETURN VARCHAR2
Здесь входная_дата — символьная строка, представляющая значение даты/времени; маска — строка из одного или нескольких элементов формата; язык_nls — строка, задающая язык отображения даты. Параметры маска и язык_nls не являются обязательными.
Чтобы результирующая строка была представлена символами национального набора, вместо функции TO_CHAR следует использовать функцию TO_NCHAR. Но имейте в виду, что в этом случае маска форматирования тоже должна быть задана в символах национального набора. В противном случае будет ошибка.
Если маска не задана, по умолчанию используется формат даты, установленный для базы данных. Это формат ‘DD-MON-RR’, если только администратор не задал другой формат, изменив значение параметра NLS_DATE_FORMAT. Но лучше не зависеть от неявных преобразований даты. Изменения серверных настроек NLS (а в клиентском коде — изменения клиентских настроек NLS) приводят к появлению логических ошибок, если ваш код зависит от неявных преобразований. Если приложение всегда выполняет преобразования явно, такие ошибки исключены.
Примеры использования функции TO_CHAR для преобразования даты
Обратите внимание на два пробела между месяцем и днем, а также на начальный нуль перед номером месяца:
TO_CHAR (SYSDATE, 'Month DD, YYYY') -- Результат -- 'February 05, 1994'
Для подавления пробелов и нулей используется элемент FM:
TO_CHAR (SYSDATE, 'FMMonth DD, YYYY') -- Результат -- 'February 5, 1994'
Обратите внимание на различие регистра в обозначении месяца в следующих двух примерах (при работе с форматами данных Oracle вы получаете в точности то, что запрашиваете):
TO_CHAR (SYSDATE, 'MON DDth, YYYY') -- Результат -- 'FEB 05TH, 1994' TO_CHAR (SYSDATE, 'fmMon DDth, YYYY') -- Результат -- 'Feb 5TH, 1994'
На элемент форматирования TH не распространяются правила задания регистра. Даже если ввести его в нижнем регистре (th), то в выходной строке база данных будет использовать TH.
Вывод дня года, дня месяца и дня недели для заданной даты:
TO_CHAR (SYSDATE, 'DDD DD D ') -- Результат -- '036 05 7' TO_CHAR (SYSDATE, 'fmDDD fmDD D ') -- Результат -- '36 05 7'
Нетривиальное форматирование для построения отчета:
TO_CHAR (SYSDATE, '"In month "RM" of year "YEAR') -- Результат -- 'In month II of year NINETEEN NINETY FOUR'
Для переменных типа TIMESTAMP время можно задавать с точностью до миллисекунд:
TO_CHAR (A_TIMESTAMP, 'YYYY-MM-DD HH:MI:SS.FF AM TZH:TZM') -- Результат -- значение вида 2002-02-19 01:52:00.123457000 PM -05:00
Метки: Oracle, Дата и время.