Si alguna vez has usado TO_CHAR()
para dar formato a una fecha que usa el nombre del mes, es posible que haya notado que a veces el mes se devuelve con el relleno correcto.
Esto sucede de forma predeterminada cuando el nombre del mes es más corto que el nombre del mes más largo, según el idioma y el calendario en uso.
Por ejemplo, si su idioma es inglés y el calendario es gregoriano, el nombre de mes más largo es septiembre, que tiene nueve caracteres. Si devuelve el mes de una fecha y es, por ejemplo, marzo (cinco caracteres), entonces, de forma predeterminada, marzo tendrá cuatro espacios finales (5 + 4 =9).
Afortunadamente, es fácil quitar este relleno derecho si es necesario. Para eliminar el relleno derecho, use el fm
modificador de formato.
El problema
Primero, este es el problema que estamos tratando de resolver:
SELECT
TO_CHAR(date '2030-03-08', 'DD-MONTH-YYYY')
FROM DUAL;
Resultado:
08-MARCH -2030
Podemos ver que hay una gran brecha entre el nombre del mes y el año. Si no queremos esta brecha, podemos usar el fm
modificador, como se muestra a continuación.
La solución
Ahora aquí está la solución:
SELECT
TO_CHAR(date '2030-03-08', 'fmDD-MONTH-YYYY')
FROM DUAL;
Resultado:
8-MARCH-2030
Ahora no hay espacio entre el mes y el año.
Todo lo que hice fue anteponer el modelo de formato con fm
.
El fm
modificador de formato significa "Modo de relleno". De forma predeterminada, Oracle utiliza caracteres en blanco al final y ceros al principio para llenar elementos de formato a un ancho constante. El ancho es igual al ancho de visualización del elemento más grande para el modelo de formato relevante. Usando el fm
El modificador suprime todo ese relleno.
Es posible que haya notado que el fm
El modificador también suprimió el cero inicial en el número del día. Si no queremos esto, podemos colocar el fm
modificador delante del MONTH
elemento de formato en su lugar.
Así:
SELECT
TO_CHAR(date '2030-03-08', 'DD-fmMONTH-YYYY')
FROM DUAL;
Resultado:
08-MARCH -2030
Esta vez, el fm
no se aplicó al día, pero fue aplicado al mes y al año.
Si no queremos suprimir los ceros iniciales del año, entonces debemos agregar otro fm
antes del año.
He aquí un ejemplo que ilustra lo que quiero decir:
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;
Resultado:
r1 r2 ______________ ________________ 08-MARCH-30 08-MARCH-0030
La primera columna usa solo un fm
(delante de MONTH
).
La segunda columna usa dos fm
modificadores (uno delante de MONTH
, y uno delante de YYYY
).