Есть ли способ отформатировать дату, чтобы показать только месяц и год в plsql? - PullRequest
2 голосов
/ 28 мая 2019

У меня не получается вывести только месяц и год, как этот December 2018, когда я сделал функцию для передачи параметра для даты.

Я сделал простую функцию с параметром, для которого дата возврата показывает только месяци год с тестовым кодом ниже.Я использовал month вместо mon, как описано выше, но между ними есть разрыв, например December 2019.

function get_month(p_month DATE DEFAULT sysdate)
return VARCHAR2
is

v_month varchar2(50);

begin

select to_char(trunc(p_month), 'Month yyyy') into v_month from dual;

return v_month;
commit;

end;

В идеале, я ожидал бы, что выходные данные месяца в полном имени будут такими, как to_char(sysdate,'Month DDth, YYYY') но без дня посередине.

Ответы [ 2 ]

7 голосов
/ 28 мая 2019

Это объясняется в документации :

Oracle использует завершающие пустые символы и начальные нули для заполнения элементов формата до постоянной ширины.Ширина равна ширине отображения наибольшего элемента для соответствующей модели формата ...

  • Символьные элементы MONTH, MON, DAY и DY дополняются концевыми пробелами до ширинысамое длинное полное название месяца ...

Но также:

Модификатор FM подавляет вышеуказанное заполнение в возвращаемом значении функции TO_CHAR.

Итак, как сказал @WernfriedDomscheit в комментарии, добавьте модификатор FM:

select to_char(trunc(p_month), 'FMMonth yyyy') into v_month from dual;

, хотя trunc() ничего не добавляет, так:

select to_char(p_month, 'FMMonth yyyy') into v_month from dual;

или, проще говоря, избегайте переключения контекста и просто назначайте напрямую:

v_month := to_char(p_month, 'FMMonth yyyy');
1 голос
/ 28 мая 2019

Параметр Month в строке формата, по-видимому, генерирует выходные данные с дополнительными пробелами, их можно обрезать, чтобы получить требуемый результат.

Попробуйте это:

select trim(to_char(sysdate,'Month'))||' '||to_char(sysdate,'yyyy')
from dual;
...