Ако някога сте използвали TO_CHAR()
функция за форматиране на дата, която използва името на месеца, може да сте забелязали, че понякога месецът се връща с десен допълване.
Това се случва по подразбиране, когато името на месеца е по-кратко от най-дългото име на месеца въз основа на използвания език и календар.
Например, ако езикът ви е английски и календарът е григориански, най-дългото име на месеца е септември, което е с девет знака. Ако върнете месеца от дата и е да речем март (с дължина от пет знака), тогава по подразбиране март ще има четири крайни интервала (5 + 4 =9).
За щастие е лесно да премахнете тази дясна подплата, ако е необходимо. За да премахнете дясната подплата, използвайте fm
модификатор на формат.
Проблемът
Първо, ето проблема, който се опитваме да разрешим:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Резултат:
08-MARCH -2030
Можем да видим, че има голяма разлика между името на месеца и годината. Ако не искаме тази празнина, можем да използваме fm
модификатор, както е показано по-долу.
Решението
Сега ето решението:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Резултат:
8-MARCH-2030
Сега няма разлика между месеца и годината.
Всичко, което направих, беше да добавя предварителния модел на формата с fm
.
fm
модификаторът на формат означава „Режим на запълване“. По подразбиране Oracle използва крайни празни знаци и водещи нули, за да запълни форматните елементи до постоянна ширина. Ширината е равна на ширината на дисплея на най-големия елемент за съответния модел на формат. Използване на fm
модификаторът потиска всички такива запълвания.
Може би сте забелязали, че fm
модификаторът също така потисна водещата нула на номера на деня. Ако не искаме това, можем да поставим fm
модификатор пред MONTH
форматен елемент вместо това.
Като това:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Резултат:
08-MARCH -2030
Този път fm
не беше приложен към деня, но беше прилага се към месеца и годината.
Ако не искаме да потискаме водещите нули от годината, тогава трябва да добавим още един fm
преди годината.
Ето един пример, който илюстрира какво имам предвид:
SELECT
TO_CHAR(date '0030-03-08', 'DD-fmMONTH-YYYY') AS "r1",
TO_CHAR(date '0030-03-08', 'DD-fmMONTH-fmYYYY') AS "r2"
FROM DUAL;
Резултат:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
Първата колона използва само един fm
(пред MONTH
).
Втората колона използва два fm
модификатори (един пред MONTH
и един пред YYYY
).