PostgreSQL trae varias funciones integradas para trabajar con valores temporales actuales. Estas funciones son útiles para tareas como registrar automáticamente cuándo se crea un registro, hacer informes basados en la fecha actual o chequear si un evento pasó en un periodo específico. Vamos a ver tres funciones principales: NOW(), CURRENT_DATE y CURRENT_TIME.
NOW(): obtener la fecha y hora actual
La función NOW() devuelve la fecha y hora actual en formato TIMESTAMP WITH TIME ZONE. O sea, el resultado incluye la hora exacta teniendo en cuenta la zona horaria del servidor.
Ejemplo:
SELECT NOW();
-- Resultado: 2025-05-25 14:30:45.761523+03
Fíjate que el resultado incluye:
- la fecha (
2025-05-25), - la hora (
14:30:45.761523), - la zona horaria (
+03).
Si no necesitas la zona horaria, puedes convertir el resultado explícitamente a TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Resultado: 2025-05-25 14:30:45.761523
CURRENT_DATE: obtener la fecha actual
La función CURRENT_DATE devuelve solo la fecha actual sin la hora. El tipo de dato devuelto es DATE.
Ejemplo:
SELECT CURRENT_DATE;
-- Resultado: 2025-05-25
Esto es útil si no te importa la hora, por ejemplo, para calcular edades o agrupar datos por día.
CURRENT_TIME: obtener la hora actual
La función CURRENT_TIME devuelve la hora actual en formato TIME WITH TIME ZONE. Si no te interesa la zona horaria, puedes convertir el resultado a TIME.
Ejemplo:
SELECT CURRENT_TIME;
-- Resultado: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Resultado: 14:30:45.761523
Ejemplos de uso de las funciones
Vamos a ver algunos ejemplos prácticos donde estas funciones pueden ser útiles.
Rellenar automáticamente la fecha de creación de un registro
Cuando agregamos registros a una tabla, muchas veces es útil guardar automáticamente la fecha y hora de creación. En PostgreSQL, puedes hacerlo poniendo DEFAULT NOW() al crear la tabla.
Ejemplo de creación de tabla:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- momento de creación de la fila
);
Agregar un registro:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Vamos a ver el contenido de la tabla:
SELECT * FROM orders;
Resultado:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Filtrar datos por fecha
Supón que tienes una tabla de pedidos y quieres seleccionar todos los pedidos creados hoy. Usamos la función CURRENT_DATE para filtrar:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Aquí usamos la conversión created_at::DATE para quitar la hora y quedarnos solo con la fecha.
Diferencias entre NOW() y CURRENT_TIMESTAMP
A primera vista, parece que NOW() y CURRENT_TIMESTAMP hacen lo mismo. Y sí, es así. Solo que la función NOW() viene de un estándar y CURRENT_TIMESTAMP de otro.
NOW() — función de PostgreSQL
La función NOW() es una función integrada de PostgreSQL que devuelve un valor de tipo TIMESTAMP WITH TIME ZONE (timestamptz). Es la hora actual del servidor en el momento de empezar la consulta SQL.
Ejemplo:
SELECT NOW();
CURRENT_TIMESTAMP — estándar SQL
CURRENT_TIMESTAMP es una expresión definida por el estándar SQL, y también devuelve TIMESTAMP WITH TIME ZONE en PostgreSQL. Básicamente, PostgreSQL implementa CURRENT_TIMESTAMP llamando a la misma función que NOW().
Ejemplo:
SELECT CURRENT_TIMESTAMP;
Comparación en la práctica
SELECT NOW(), CURRENT_TIMESTAMP;
Resultado:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Ambos valores son iguales porque se calculan en el mismo momento — al inicio de la consulta.
Usar funciones de tiempo en condiciones de filtrado
Ahora vamos a escribir una consulta que selecciona los registros creados en los últimos 7 días. Para eso puedes usar NOW() con operaciones aritméticas sobre fechas:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
De forma parecida, si quieres seleccionar pedidos del mes actual, puedes usar la función DATE_TRUNC() para recortar el inicio del mes:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() es una función interesante, te cuento más sobre ella en un par de clases :P
Consejos prácticos
- Usa
NOW()oCURRENT_TIMESTAMPsi necesitas la hora exacta con zona horaria. - Aplica
CURRENT_DATEsi solo te interesa la fecha (por ejemplo, para calcular edades o analizar eventos de un día concreto). CURRENT_TIMEse usa sobre todo para mostrar la hora en informes o interfaces donde importa cuánto tiempo se gastó en una tarea.
En la próxima clase vamos a empezar a extraer partes de fechas y horas usando las funciones EXTRACT() y AGE(). Con ellas puedes, por ejemplo, calcular fácilmente la edad de una persona o trabajar con datos por días, meses o años.
GO TO FULL VERSION