Om du någonsin har använt TO_CHAR()
funktion för att formatera ett datum som använder månadsnamnet, du kanske har märkt att månaden ibland returneras med rätt utfyllnad.
Detta händer som standard när månadsnamnet är kortare än det längsta månadsnamnet, baserat på språket och kalendern som används.
Till exempel, om ditt språk är engelska och kalendern är gregoriansk, är den längsta månadsnamnet september, som är nio tecken långt. Om du returnerar månaden från ett datum, och det sägs mars (fem tecken långt), kommer mars som standard att ha fyra efterföljande mellanslag (5 + 4 =9).
Lyckligtvis är det lätt att ta bort denna rätta stoppning om det behövs. För att ta bort rätt stoppning, använd fm
formatmodifierare.
Problemet
Först, här är problemet vi försöker lösa:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Resultat:
08-MARCH -2030
Vi kan se att det finns ett stort gap mellan månadens namn och året. Om vi inte vill ha denna lucka kan vi använda fm
modifierare, som visas nedan.
Lösningen
Här är lösningen:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Resultat:
8-MARCH-2030
Nu finns det ingen skillnad mellan månaden och året.
Allt jag gjorde var att lägga till formatmodellen med fm
.
fm
formatmodifier står för "Fill Mode". Som standard använder Oracle efterföljande tomma tecken och inledande nollor för att fylla formatelement till en konstant bredd. Bredden är lika med visningsbredden för det största elementet för den relevanta formatmodellen. Använda fm
modifierare undertrycker all sådan utfyllnad.
Du kanske har märkt att fm
modifieraren undertryckte också den inledande nollan på dagnumret. Om vi inte vill ha detta kan vi placera fm
modifierare framför MONTH
formatelement istället.
Så här:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Resultat:
08-MARCH-2030
Den här gången, fm
tillämpades inte på dagen, men det var tillämpas på månaden och året.
Om vi inte vill ta bort inledande nollor från året måste vi lägga till ytterligare en fm
före året.
Här är ett exempel som illustrerar vad jag menar:
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;
Resultat:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
Den första kolumnen använder bara en fm
(framför MONTH
).
Den andra kolumnen använder två fm
modifierare (en framför MONTH
, och en framför YYYY
).