
Cómo Trabajar con Fechas en n8n y PostgreSQL: Guía Completa
¿Por qué las fechas se ven tan raras en la base de datos?
Cuando trabajas con n8n y PostgreSQL, probablemente has visto fechas que se almacenan así en tu base de datos:
2025-11-04 22:32:34.817+00
Este formato puede parecer complicado, pero tiene mucho sentido. Vamos a desglosarlo parte por parte:
- 2025-11-04: Es la fecha (año-mes-día)
- 22:32:34: Es la hora (hora:minutos:segundos)
- .817: Son milisegundos (fracciones de segundo)
- +00: Es la zona horaria (en este caso, UTC o tiempo universal)
¿Por qué es importante la zona horaria?
Imagina que trabajas con clientes en Monterrey, México, pero tu servidor de base de datos está en otro país. Si guardas “9:00 AM” sin especificar la zona horaria, ¿son las 9 AM de Monterrey o las 9 AM del servidor? Esta confusión puede causar grandes problemas.
PostgreSQL usa timestamptz (timestamp with time zone) para resolver este problema. Guarda todas las fechas en formato UTC (tiempo universal coordinado), que es como el “idioma universal” del tiempo. Luego, cuando consultas esa fecha, PostgreSQL la puede convertir a cualquier zona horaria que necesites.
Cómo Guardar Fechas Correctamente
Entendiendo el formato de guardado
Cuando guardas una fecha en PostgreSQL con zona horaria, usas este formato:
UPDATE public.contactos
SET fecha_recordatorio = '2025-11-04 15:00:00+00'::timestamptz
WHERE id = 2003614;
Aquí está pasando algo importante: estás guardando las 3:00 PM en hora UTC (el +00 indica UTC). Pero si quieres que esa hora represente las 9:00 AM en Monterrey, necesitas hacer la conversión.
¿Cómo convertir la hora local a UTC?
Monterrey está en la zona horaria Centro de México, que generalmente es UTC-6 (6 horas detrás de UTC). Entonces:
- 9:00 AM en Monterrey = 3:00 PM en UTC (sumas 6 horas)
- Por eso usamos
'2025-11-04 15:00:00+00'
Método más fácil: dejar que PostgreSQL haga la conversión
En lugar de calcular manualmente, puedes hacer esto:
UPDATE public.contactos
SET fecha_recordatorio = '2025-11-04 09:00:00'::timestamp AT TIME ZONE 'America/Monterrey'
WHERE id = 2003614;
Esto le dice a PostgreSQL: “Esta es la hora local de Monterrey, conviértela automáticamente a UTC para almacenarla”. Mucho más fácil y sin errores de cálculo.
Cómo Consultar Fechas con Zona Horaria
Ejemplo simple: Buscar un contacto por fecha específica
Empecemos con algo sencillo. Imagina que quieres buscar todos los contactos que tienen un recordatorio programado para el 4 de noviembre de 2025 en hora de Monterrey:
SELECT id, nombre_contacto, fecha_recordatorio
FROM public.contactos
WHERE (fecha_recordatorio AT TIME ZONE 'America/Monterrey')::date = '2025-11-04'
AND recordatorio = TRUE;
¿Qué hace esta consulta?
fecha_recordatorio AT TIME ZONE 'America/Monterrey'– Convierte la fecha de UTC a hora de Monterrey::date– Extrae solo la parte de la fecha (ignora las horas)= '2025-11-04'– Compara si es el 4 de noviembre
Así de simple. Esta consulta te devuelve todos los recordatorios de ese día específico, sin importar a qué hora del día estén programados.
Ejemplo intermedio: Buscar recordatorios de hoy
Ahora queremos algo más dinámico: buscar todos los recordatorios programados para hoy (cualquiera que sea el día actual):
SELECT id, nombre_contacto, fecha_recordatorio
FROM public.contactos
WHERE (fecha_recordatorio AT TIME ZONE 'America/Monterrey')::date = (NOW() AT TIME ZONE 'America/Monterrey')::date
AND recordatorio = TRUE;
Aquí usamos NOW() que devuelve la fecha y hora actual, la convertimos a hora de Monterrey, y extraemos solo la fecha para compararla. Simple y efectivo.
Por qué es mejor PostgreSQL que Data Table de n8n

Las nuevas tablas de n8n (Data Tables) funcionan perfectamente para casos sencillos: guardar datos, hacer consultas básicas, y mantener información simple. Son fáciles de configurar y no requieren conocimientos técnicos avanzados.
Sin embargo, para casos más complejos, es mucho mejor una base de datos que te permita trabajar con SQL como PostgreSQL. Te voy a mostrar un ejemplo real de por qué.
El problema con Data Tables para operaciones complejas
Imagina que necesitas hacer esta tarea en n8n:
- Buscar contactos que tengan un recordatorio programado para hoy (en hora de Monterrey)
- Verificar que el campo “recordatorio” esté activo (TRUE)
- Calcular cuántas horas han pasado desde el último mensaje
- Si no hay resultados, devolver una fila vacía para evitar errores en el flujo
- Ordenar y formatear los resultados
Con Data Tables de n8n, necesitarías aproximadamente:
- 1 nodo para leer los datos
- 1 nodo Code para convertir las fechas a zona horaria local
- 1 nodo IF para filtrar por fecha de hoy
- 1 nodo IF adicional para filtrar por recordatorio = TRUE
- 1 nodo Code para calcular la diferencia en horas
- 1 nodo IF para verificar si hay resultados
- 1 nodo para devolver datos vacíos si no hay resultados
- 1 nodo Set para formatear la salida
Total: 8 nodos (y eso sin contar posibles nodos adicionales para depuración)
La solución con PostgreSQL y SQL
Con PostgreSQL, todo esto se hace en un solo nodo de base de datos con esta consulta:
WITH resultados AS (
SELECT
id, nombre_contacto, etiqueta, fecha_creacion, estado_contacto, estado, ultimo_mensaje,
revivir_date, revivir, talk_id, telefono, id_contacto, recordatorio, fecha_recordatorio,
(EXTRACT(EPOCH FROM (fecha_recordatorio - ultimo_mensaje)) / 3600)::float AS diferencia_horas
FROM public.contactos
WHERE fecha_recordatorio AT TIME ZONE 'America/Monterrey' >= date_trunc('day', NOW() AT TIME ZONE 'America/Monterrey')
AND fecha_recordatorio AT TIME ZONE 'America/Monterrey' < date_trunc('day', NOW() AT TIME ZONE 'America/Monterrey') + INTERVAL '1 day'
AND recordatorio = TRUE
)
SELECT * FROM resultados
UNION ALL
SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
WHERE NOT EXISTS (SELECT 1 FROM resultados);
Total: 1 nodo de PostgreSQL
Desglosando esta consulta avanzada
1. La cláusula WITH (Common Table Expression)
WITH resultados AS (...)
Esto crea una “tabla temporal” llamada resultados que solo existe durante esta consulta. Es como tener una variable que guarda el resultado intermedio.
2. Selección de columnas con cálculos
(EXTRACT(EPOCH FROM (fecha_recordatorio - ultimo_mensaje)) / 3600)::float AS diferencia_horas
Esta línea hace magia: resta dos fechas, convierte el resultado a segundos, lo divide entre 3600 para obtener horas, y lo formatea como número decimal. Todo en una sola expresión.
3. Filtrado por fecha de hoy en zona horaria local
WHERE fecha_recordatorio AT TIME ZONE 'America/Monterrey' >= date_trunc('day', NOW() AT TIME ZONE 'America/Monterrey')
AND fecha_recordatorio AT TIME ZONE 'America/Monterrey' < date_trunc('day', NOW() AT TIME ZONE 'America/Monterrey') + INTERVAL '1 day'
Estas dos condiciones verifican que la fecha esté entre las 00:00:00 de hoy y las 00:00:00 de mañana en hora de Monterrey. Es la forma correcta de comparar “es hoy” considerando zonas horarias.
4. Manejo de resultados vacíos
UNION ALL
SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
WHERE NOT EXISTS (SELECT 1 FROM resultados);
Si no hay resultados, en lugar de devolver nada (lo que podría causar errores en n8n), devuelve una fila con valores NULL. Esto mantiene tu flujo funcionando sin problemas.
Ventajas adicionales de PostgreSQL
Rendimiento: Una consulta SQL procesa millones de registros en segundos. Con múltiples nodos en n8n, cada uno procesando datos uno por uno, el rendimiento se degrada significativamente con volúmenes grandes.
Mantenibilidad: Es más fácil actualizar una consulta SQL que reconstruir 8 nodos conectados en n8n. Cambias una línea de código y listo.
Debugging: Si algo falla, es más fácil probar una consulta SQL directamente en la base de datos que depurar un flujo complejo con múltiples nodos.
Transacciones: PostgreSQL garantiza que las operaciones se completen correctamente o se reviertan. Con múltiples nodos, si falla en el nodo 5, los nodos 1-4 ya ejecutaron sus cambios.
Funciones avanzadas: Operaciones con fechas, cálculos matemáticos, agregaciones complejas, y joins entre múltiples tablas son triviales en SQL pero muy complicados con nodos de n8n.
Aprende SQL para llevar tus automatizaciones al siguiente nivel

Si después de leer este artículo te diste cuenta del poder que tiene SQL para simplificar tus flujos de n8n, es momento de profundizar en este conocimiento. Dominar SQL no solo te ahorrará tiempo y nodos en n8n, sino que te abrirá las puertas a crear automatizaciones verdaderamente profesionales y escalables.
Para quienes quieren ir más allá de consultas básicas y realmente dominar SQL, recomiendo estos recursos especializados:
Curso Profesional de SQL – Si trabajas con PostgreSQL, MySQL o cualquier base de datos relacional, este curso te llevará desde los fundamentos hasta consultas avanzadas como las que vimos en este artículo. Aprenderás a manejar fechas, crear consultas complejas con CTEs (WITH), realizar joins, y optimizar tus queries para obtener el máximo rendimiento.
Curso de Administración de Base de Datos en MSSQL – Si tu stack incluye Microsoft SQL Server, este curso te enseña no solo a escribir consultas, sino a administrar correctamente tu servidor, gestionar seguridad, crear stored procedures, functions, triggers, y automatizar backups. Es ideal para quienes necesitan mantener bases de datos en producción de manera profesional.
Estos cursos son especialmente valiosos si trabajas con n8n profesionalmente, ya que te permiten diseñar soluciones más eficientes, mantener código más limpio, y resolver problemas complejos que serían imposibles o extremadamente complicados usando solo nodos visuales.
Consejos Prácticos para n8n
1. Configura tu zona horaria en PostgreSQL
En tu nodo de PostgreSQL en n8n, asegúrate de que las consultas siempre especifiquen la zona horaria. No confíes en la configuración predeterminada del servidor.
2. Usa siempre timestamptz
Cuando crees columnas para fechas con hora, usa:
ALTER TABLE public.contactos
ALTER COLUMN fecha_recordatorio
TYPE timestamptz
USING fecha_recordatorio::timestamptz;
3. Guarda siempre en UTC o especifica la zona
Cuando guardes desde n8n, usa uno de estos métodos:
- Especifica UTC:
'2025-11-04 15:00:00+00' - Especifica tu zona local:
'2025-11-04 09:00:00'::timestamp AT TIME ZONE 'America/Monterrey'
4. Consulta siempre con tu zona horaria
En tus consultas SELECT, siempre convierte a tu zona horaria local para comparaciones:
fecha_recordatorio AT TIME ZONE 'America/Monterrey'
Errores Comunes a Evitar
Error 1: Comparar directamente sin conversión de zona
❌ Incorrecto:
WHERE fecha_recordatorio = CURRENT_DATE
✅ Correcto:
WHERE (fecha_recordatorio AT TIME ZONE 'America/Monterrey')::date = (NOW() AT TIME ZONE 'America/Monterrey')::date
Error 2: No especificar el tipo timestamptz
❌ Incorrecto:
SET fecha_recordatorio = '2025-11-04 15:00:00'
✅ Correcto:
SET fecha_recordatorio = '2025-11-04 15:00:00+00'::timestamptz
Error 3: Confundir la zona horaria al guardar
Si quieres guardar 9 AM de Monterrey:
❌ Incorrecto: '2025-11-04 09:00:00+00' (esto es 9 AM UTC, no Monterrey)
✅ Correcto: '2025-11-04 15:00:00+00' (3 PM UTC = 9 AM Monterrey)
Conclusión
Trabajar con fechas y zonas horarias puede parecer complicado al principio, pero una vez que entiendes los conceptos básicos, se vuelve natural:
- PostgreSQL guarda todo en UTC por consistencia
- Usas
AT TIME ZONEpara convertir entre UTC y tu zona local - Siempre especifica el tipo
timestamptzpara mantener la información de zona horaria - Cuando consultes, convierte a tu zona local antes de comparar
Para proyectos simples, Data Tables de n8n es suficiente. Pero cuando necesitas operaciones complejas con fechas, cálculos, filtros múltiples y manejo de casos especiales, PostgreSQL con SQL te ahorra tiempo, nodos y dolores de cabeza. En lugar de 8+ nodos haciendo malabarismos con datos, usas 1 nodo con una consulta bien escrita.
La inversión en aprender SQL básico se paga rápidamente cuando ves tus flujos de n8n más limpios, rápidos y fáciles de mantener. Y si quieres llevar tus habilidades al siguiente nivel profesional, considera tomar un curso especializado que te enseñe no solo las consultas básicas, sino también la administración, optimización y las mejores prácticas para trabajar con bases de datos en producción.
¿Quieres aprender a trabajar con n8n desde cero?
En Azul School puedes aprender todo lo necesario para crear automatizaciones y agentes de IA con n8n, sin experiencia previa. Nuestra plataforma incluye clases en vivo, cursos profesionales paso a paso, y acompañamiento personalizado para ayudarte a lanzar tus propios proyectos.
- Haz clic aquí para adquirir tu membresía y comenzar ahora mismo.
- ¿Prefieres que te expliquemos todo en una reunión? Haz clic aquí para hablar con Grecia, nuestra agente de IA, y agenda una llamada para conocer toda nuestra oferta educativa.
¡Te esperamos en Azul School!

Respuestas