Pokud jste někdy použili TO_CHAR()
Pokud chcete formátovat datum, které používá název měsíce, možná jste si všimli, že někdy je měsíc vrácen se správným odsazením.
Ve výchozím nastavení se to stane, když je název měsíce kratší než nejdelší název měsíce, podle používaného jazyka a kalendáře.
Pokud je například vaším jazykem angličtina a kalendář je gregoriánský, nejdelší název měsíce je září, který má devět znaků. Pokud vrátíte měsíc z data a je to řekněme Březen (pět znaků), pak bude mít březen ve výchozím nastavení čtyři mezery na konci (5 + 4 =9).
Naštěstí je snadné toto pravé vycpávky v případě potřeby odstranit. Chcete-li odstranit správnou výplň, použijte fm
modifikátor formátu.
Problém
Za prvé, zde je problém, který se snažíme vyřešit:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Výsledek:
08-MARCH -2030
Vidíme, že mezi názvem měsíce a rokem je velká mezera. Pokud tuto mezeru nechceme, můžeme použít fm
modifikátor, jak je uvedeno níže.
Řešení
Nyní je řešení:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Výsledek:
8-MARCH-2030
Nyní mezi měsícem a rokem není žádná mezera.
Vše, co jsem udělal, bylo, že jsem před formátový model přidal fm
.
fm
Modifikátor formátu znamená „Režim plnění“. Ve výchozím nastavení Oracle používá koncové prázdné znaky a úvodní nuly k vyplnění prvků formátu na konstantní šířku. Šířka se rovná šířce zobrazení největšího prvku pro příslušný model formátu. Pomocí fm
modifikátor potlačí všechny takové výplně.
Možná jste si všimli, že fm
modifikátor také potlačil úvodní nulu v čísle dne. Pokud to nechceme, můžeme umístit fm
modifikátor před MONTH
formátovací prvek.
Takhle:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Výsledek:
08-MARCH-2030
Tentokrát fm
nebylo použito na daný den, ale bylo platí pro měsíc a rok.
Pokud nechceme potlačit úvodní nuly z roku, musíme přidat další fm
před rokem.
Zde je příklad, který ilustruje, co mám na mysli:
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;
Výsledek:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
První sloupec používá pouze jeden fm
(před MONTH
).
Druhý sloupec používá dva fm
modifikátory (jeden před MONTH
a jeden před YYYY
).