Als je ooit de TO_CHAR()
. hebt gebruikt functie om een datum op te maken die de naam van de maand gebruikt, is het je misschien opgevallen dat de maand soms wordt geretourneerd met de juiste opvulling.
Dit gebeurt standaard wanneer de naam van de maand korter is dan de langste naam van de maand, gebaseerd op de taal en de kalender die wordt gebruikt.
Als uw taal bijvoorbeeld Engels is en de kalender Gregoriaans, is de naam van de langste maand september, die negen tekens lang is. Als u de maand van een datum retourneert, en het is bijvoorbeeld maart (vijf tekens lang), dan heeft maart standaard vier volgspaties (5 + 4 =9).
Gelukkig is het eenvoudig om deze juiste vulling indien nodig te verwijderen. Gebruik de fm
. om de juiste opvulling te verwijderen formaatmodificator.
Het probleem
Ten eerste, hier is het probleem dat we proberen op te lossen:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Resultaat:
08-MARCH -2030
We kunnen zien dat er een grote kloof is tussen de naam van de maand en het jaar. Als we deze kloof niet willen, kunnen we de fm
. gebruiken modifier, zoals hieronder weergegeven.
De oplossing
Dit is de oplossing:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Resultaat:
8-MARCH-2030
Nu is er geen gat meer tussen de maand en het jaar.
Het enige wat ik deed was het formaatmodel toevoegen met fm
.
De fm
format modifier staat voor "Fill Mode". Oracle gebruikt standaard blanco tekens en voorloopnullen om formaatelementen tot een constante breedte te vullen. De breedte is gelijk aan de weergavebreedte van het grootste element voor het betreffende formaatmodel. De fm
gebruiken modifier onderdrukt al deze opvulling.
Het is je misschien opgevallen dat de fm
modifier onderdrukte ook de voorloopnul op het dagnummer. Als we dit niet willen, kunnen we de fm
modifier voor de MONTH
formaatelement in plaats daarvan.
Zoals dit:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Resultaat:
08-MARCH-2030
Deze keer is de fm
werd niet toegepast op de dag, maar het was was toegepast op de maand en het jaar.
Als we voorloopnullen van het jaar niet willen onderdrukken, dan moeten we nog een fm
toevoegen voor het jaar.
Hier is een voorbeeld dat illustreert wat ik bedoel:
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;
Resultaat:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
De eerste kolom gebruikt slechts één fm
(voor MONTH
).
De tweede kolom gebruikt twee fm
modifiers (één voor MONTH
, en één voor YYYY
).