Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Вывести дату строкой


Автор: -Сергей- 18.3.2009, 06:14
Добрый день!

выполняю следующий запрос
Код

select trim(to_char(sysdate,'«dd» Month yyyy')||' г.') "DATE" from dual


на выходе понятно что получаю «18» Март     2009 г.

Вопрос:

Возможно ли стандартными методами сделать так чтобы месяц выводился: Января, Февраля, Марта и т.д.?

Или надо будет руками все парсить?

И еще как от лишних пробелов между месяцем и годом избавиться?

Автор: azesmcar 18.3.2009, 08:06
Код

create or replace function formatDate(dt date)
    return varchar2 is
begin
    return    to_char(dt, '«dd» ') ||
            rtrim(to_char(dt,'month')) ||
            case when to_char(dt,'mm') in ('03', '08') then 'а' else 'я' end ||
            to_char(dt, ' yyyy') || ' г.';
end;

select formatDate(sysdate) from dual


Автор: -Сергей- 18.3.2009, 10:16
azesmcar, Спасибо! Значит руками все-таки!

при вызове ошибку выдает
Цитата

ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения
ORA-06512: на  "SM.FORMATDATE", line 4

View program sources of error stack?


я поправил, вот так работает
Код

create or replace function FormatDate(dt in date) return varchar2 is
  dateout varchar2(30);
begin
  select to_char(dt, '«dd» ') ||
         rtrim(to_char(dt,'month')) ||
         case when to_char(dt,'mm') in ('03', '08') then 'а' else 'я' end ||
         to_char(dt, ' yyyy') || ' г.' into dateout from dual;
  return ltrim(rtrim(dateout));
end;

Автор: azesmcar 18.3.2009, 10:27
Цитата

Значит руками все-таки! 


ну да, там особо нечего делать, на А заканчиваются только "МартА" и "АвгустА", остальные на Я..

Автор: password 18.3.2009, 10:42
Код

select to_char(sysdate, 'dd')||' '||
(case when to_char(sysdate, 'mm')='01' then 'января' 
      when to_char(sysdate, 'mm')='02' then 'февраля'
      when to_char(sysdate, 'mm')='03' then 'марта'
      when to_char(sysdate, 'mm')='04' then 'апреля'
      when to_char(sysdate, 'mm')='05' then 'мая'
      when to_char(sysdate, 'mm')='06' then 'июня'
      when to_char(sysdate, 'mm')='07' then 'июля'
      when to_char(sysdate, 'mm')='08' then 'августа'
      when to_char(sysdate, 'mm')='09' then 'сентября'
      when to_char(sysdate, 'mm')='10' then 'октября'
      when to_char(sysdate, 'mm')='11' then 'ноября'
      when to_char(sysdate, 'mm')='12' then 'декабря'
       end)||' '||to_char(sysdate, 'yyyy')||' г.' ddd from dual

Автор: -Сергей- 18.3.2009, 10:44
Всем спасибо!

Автор: azesmcar 18.3.2009, 10:47
-Сергей-, совсем забыл, надо последний символ убрать только для тех кто на я заканчивается

Автор: Zloxa 18.3.2009, 10:50
Цитата(-Сергей- @  18.3.2009,  10:16 Найти цитируемый пост)
ORA-06502

Видимо Вы сделали чуть не так, как вам показали
Цитата(-Сергей- @  18.3.2009,  10:16 Найти цитируемый пост)
я поправил

Зря Вы используете Select into там, где можно обойтись обычным присваиванием, это существенно отаржается по производительности.
Вообще по хорошему, уже само наличие функции существенно замедлит работу. Может быть лучшим решением было бы, там где это надо, использовать выражение а не функцию.

К варианту azesmcar, могу лищь порекомендовать объявить функцию как детерминированную (начиная с десятки оракля вроде предпринимает попытки кэширования результатов детерминированных функций), ну и явно указывать nls_language в to_char-е, чтобы не получалось чтото вроде :
Код

SQL> select formatDate(sysdate) from dual;
 
FORMATDATE(SYSDATE)
--------------------------------------------------------------------------------
«18» marchа 2009 г.
 

Автор: azesmcar 18.3.2009, 10:57
Цитата

при вызове ошибку выдает


у меня работает..
Цитата

ну и явно указывать nls_language в to_char-е


стоит добавить..

Автор: -Сергей- 18.3.2009, 14:06
Цитата

Видимо Вы сделали чуть не так, как вам показали

Все также до последнего символа!

Цитата

Зря Вы используете Select into там

Если по-другому не работает то как еще

Автор: Zloxa 18.3.2009, 14:14
Цитата(-Сергей- @  18.3.2009,  14:06 Найти цитируемый пост)
Если по-другому не работает

Значит чтото не то делаете
Код

SQL> create or replace function formatDate(dt date)
  2      return varchar2 is
  3  begin
  4      return    to_char(dt, '«dd» ') ||
  5              rtrim(to_char(dt,'month','nls_date_language=russian')) ||
  6              case when to_char(dt,'mm') in ('03', '08') then 'а' else 'я' end ||
  7              to_char(dt, ' yyyy') || ' г.';
  8  end;
  9  /
 
Function created
SQL> select formatDate(sysdate) from dual;
 
FORMATDATE(SYSDATE)
--------------------------------------------------------------------------------
«18» марта 2009 г.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)