Jeśli kiedykolwiek używałeś TO_CHAR()
Aby sformatować datę używającą nazwy miesiąca, mogłeś zauważyć, że czasami miesiąc jest zwracany z odpowiednim wypełnieniem.
Dzieje się tak domyślnie, gdy nazwa miesiąca jest krótsza niż najdłuższa nazwa miesiąca, na podstawie używanego języka i kalendarza.
Na przykład, jeśli Twoim językiem jest angielski, a kalendarz to gregoriański, najdłuższą nazwą miesiąca jest wrzesień, który ma dziewięć znaków. Jeśli zwrócisz miesiąc od daty, czyli marzec (długość pięciu znaków), to domyślnie marzec będzie miał cztery końcowe spacje (5 + 4 =9).
Na szczęście w razie potrzeby można łatwo usunąć tę właściwą wyściółkę. Aby usunąć właściwe wypełnienie, użyj fm
modyfikator formatu.
Problem
Po pierwsze, oto problem, który próbujemy rozwiązać:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Wynik:
08-MARCH -2030
Widzimy, że istnieje duża luka między nazwą miesiąca a rokiem. Jeśli nie chcemy tej luki, możemy użyć fm
modyfikator, jak pokazano poniżej.
Rozwiązanie
Oto rozwiązanie:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Wynik:
8-MARCH-2030
Teraz nie ma przerwy między miesiącem a rokiem.
Wszystko, co zrobiłem, to poprzedzenie modelu formatu przedrostkiem fm
.
fm
modyfikator formatu oznacza „Tryb wypełniania”. Domyślnie Oracle używa końcowych pustych znaków i wiodących zer do wypełnienia elementów formatu do stałej szerokości. Szerokość jest równa szerokości wyświetlania największego elementu dla odpowiedniego modelu formatu. Korzystanie z fm
modyfikator tłumi takie dopełnienie.
Być może zauważyłeś, że fm
modyfikator również tłumił wiodące zero w numerze dnia. Jeśli tego nie chcemy, możemy umieścić fm
modyfikator przed MONTH
zamiast tego element formatu.
Tak:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Wynik:
08-MARCH-2030
Tym razem fm
nie został zastosowany do dnia, ale był stosowane do miesiąca i roku.
Jeśli nie chcemy pomijać wiodących zer z roku, musimy dodać kolejny fm
przed rokiem.
Oto przykład, który ilustruje, o co mi chodzi:
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;
Wynik:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
Pierwsza kolumna używa tylko jednego fm
(przed MONTH
).
Druga kolumna używa dwóch fm
modyfikatory (jeden przed MONTH
, a jeden przed YYYY
).