sql >> Databasteknik >  >> RDS >> Oracle

Hur man tar bort de efterföljande utrymmena efter månadens namn i Oracle

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 ).


  1. Radoffset i SQL Server

  2. SQL Server ROWCOUNT_BIG()

  3. MySQL-utlösare kan inte uppdatera rader i samma tabell som utlösaren är tilldelad. Föreslagen lösning?

  4. SQL:När det gäller NOT IN och NOT Equal TO, vilket är mer effektivt och varför?