sqlpostgresqlto-charformatting

TO_CHAR en SQL: formatear fechas y numeros como texto con plantillas

Como TO_CHAR convierte una fecha o un numero en texto con una plantilla: YYYY-MM-DD, HH24:MI, nombres de mes, separadores de miles y las diferencias con MySQL.

3 min de lecturaReferencesql · postgresql · to-char · formatting · dates · mysql

TO_CHAR toma una fecha, una marca de tiempo o un numero y devuelve una cadena armada a partir de una plantilla de texto. Es la herramienta principal de PostgreSQL para la salida orientada a personas: una fecha fija para un informe, una hora sin segundos, un precio con separadores de miles.

Plantillas para fechas y horas

El primer argumento es el valor, el segundo es una plantilla con codigos de campo. La puntuacion y los caracteres literales de la plantilla se mantienen tal cual, asi que los guiones, los dos puntos y los espacios los pones tu.

SELECT TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI') AS ts
FROM users
ORDER BY created_at
LIMIT 5;
-- 2026-06-17 14:32

Los codigos mas habituales:

  • YYYY es el ano de 4 digitos, YY el de 2.
  • MM es el mes en numero (01-12), DD el dia, HH24 la hora de 24 horas, MI los minutos, SS los segundos.
  • HH12 con AM/PM da la hora de 12 horas.
  • Day, Mon, Month son los nombres de dia y mes en texto (reglas de mayusculas mas abajo).

Cuidado con la trampa clasica: MM es el mes y MI son los minutos. Es muy facil escribir HH24:MM y obtener el numero de mes donde querias los minutos.

Nombres de mes y localizacion

Los codigos Day, Month, Mon, Dy copian las mayusculas de la plantilla: Day da Monday, DAY da MONDAY, day da monday. Los campos de texto se rellenan con espacios hasta un ancho fijo; quita ese relleno con el modificador FM.

SELECT
  TO_CHAR(created_at, 'FMDay, FMDD FMMonth YYYY') AS human_date,
  TO_CHAR(created_at, 'Dy')                       AS short_dow
FROM orders
LIMIT 3;
-- Wednesday, 17 June 2026 | Wed

El idioma de los nombres viene del parametro lc_time. Para forzar nombres localizados en una sola consulta, activa el modo traduccion con el prefijo TM:

SELECT TO_CHAR(
  created_at,
  'TMDay, DD TMMonth YYYY'
) AS local_date
FROM orders;
-- con lc_time = es_ES.UTF-8: miercoles, 17 junio 2026

El prefijo TM (translate mode) activa los nombres segun la configuracion regional. Sin el siempre obtienes los ingleses Monday/June.

Formatear numeros

Con numeros, TO_CHAR controla el ancho, la agrupacion y el signo mediante una mascara hecha con 9, 0, D, G y demas.

SELECT
  TO_CHAR(amount, 'FM999G999G990D00')  AS money,
  TO_CHAR(id,     '0000')              AS padded_id
FROM orders
LIMIT 3;
-- 1,250.00 | 0042

Como leer la mascara:

  • 9 es un digito con los ceros a la izquierda suprimidos; 0 es un digito que siempre se imprime (usalo para rellenar por la izquierda).
  • D es el separador decimal, G el de grupos; los caracteres reales siguen la localizacion (lc_numeric).
  • FM recorta de nuevo el espacio inicial que TO_CHAR reserva para el signo.
  • L inserta el simbolo de moneda, S imprime el signo +/-.

Trampa: sin FM, los numeros positivos salen con un espacio inicial donde iria el menos, y las columnas del informe se descuadran. Para dinero casi siempre quieres FM mas un 0 explicito antes de D, o 0.50 saldra como .50.

En que se diferencia PostgreSQL de MySQL

MySQL no tiene TO_CHAR para fechas; usa DATE_FORMAT con un conjunto de codigos basado en % totalmente distinto.

-- PostgreSQL
SELECT TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI') FROM users;

-- MySQL
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') FROM users;

Las diferencias clave:

  • Minutos: PostgreSQL usa MI, MySQL usa %i (mientras que %m en MySQL es el mes).
  • Reloj de 24 horas: PostgreSQL HH24, MySQL %H.
  • Nombre del mes: PostgreSQL Month/Mon, MySQL %M/%b.
  • Numeros: en MySQL usas una FORMAT(amount, 2) aparte para agrupar, no TO_CHAR.

ClickHouse toma un tercer camino: formatDateTime(created_at, '%Y-%m-%d %H:%M'), codigos al estilo de MySQL, pero aqui %M son los minutos, no el mes. La leccion: una plantilla de TO_CHAR no es portable, y cambiar de base de datos obliga a reescribirla por completo.

Practica con ejercicios reales

Resuelve ejercicios en el entrenador de SQL con corrección instantánea y pistas.

Abrir el entrenador