Funciones de fecha en Postgresql

Oct. 14, 2012

Los que hayáis trabajado con PostgreSQl quizá os hayáis enfrentado al tedio que supone tener que utilizar las funciones de fecha que proporciona PostgreSQL cuando queréis emplear parte de una fecha en vuestras consultas.  Por ejemplo, cuando queremoshacer consultas sobre meses, no nos queda más remedio que usar la funcion extract, que funciona más o menos así:

extract(parte de la fecha from campo de fecha)

De manera que para emplear en una consulta el mes y el año de una fecha, tendríamos que escribir algo como:

SELECT extract(month from fecha) as mes, extract(year from fecha) FROM mitabla;

Por no contar si lo que queremos es seleccionar los datos por trimestre, la cosa se complica:

SELECT CASE WHEN extract(month from fecha) IN (1,2,3) THEN 1 WHEN extract(month from fecha) IN (4,5,6) THEN 2 WHEN extract(month from fecha) IN (7,8,9) THEN 3 WHEN extract(month from fecha) IN (10,11,12) THEN 4 END FROM mitabla;

Lo cual es , obviamente, muy engorroso.  De manera que un día me puse con el manual de PostgreSQL y me saqué unas funciones mucho más sencillas de utilizar. Una función que me devuelve directamente el mes a partir de una fecha y otra que me devuelve el trimestre. Con el mismo esquema se podría hacer un juego completo para el año y el día.

Mis funciones de fecha

En primer lugar, os paso la función trimestre:

CREATE OR REPLACE FUNCTION trimestre(date) RETURNS integer AS $BODY$ DECLARE mes int :=extract(month from $1); BEGIN

IF mes in (1,2,3) THEN RETURN 1; END IF; IF mes in (4,5,6) THEN RETURN 2; END IF; IF mes in (7,8,9) THEN RETURN 3; END IF; IF mes in (10,11,12) THEN RETURN 4; END IF; END; $BODY$ LANGUAGE plpgsql VOLATILE;

El funcionamiento es, como habreis podido ver, muy sencillo. Practicamente es la misma consulta a la que me he referido antes, pero convertida en funcion. De esta manera, nuestra pesada consulta anterior su transforma en:

SELECT trimestre(fecha) FROM mitabla;

De manera muy similar ocurre con la funcion mes:

CREATE OR REPLACE FUNCTION mes(timestamp without time zone) RETURNS integer AS $BODY$ DECLARE mes int :=extract(month from $1); BEGIN RETURN mes; END; $BODY$ LANGUAGE plpgsql VOLATILE;

En fin, espero que ambas funciones de fecha os resulten útiles. ¡¡Espero vuestros comentarios!!