Con un ejemplo:
Código sql:
Ver originalpruebas=> CREATE TABLE table1(fecha TIMESTAMP);
CREATE TABLE
pruebas=> INSERT INTO table1 VALUES('2009-01-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-02-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-03-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-04-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-05-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-06-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-07-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-08-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-09-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-10-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-11-01');
INSERT 0 1
pruebas=> INSERT INTO table1 VALUES('2009-12-01');
INSERT 0 1
pruebas=> SELECT fecha FROM table1;
fecha
---------------------
2009-01-01 00:00:00
2009-02-01 00:00:00
2009-03-01 00:00:00
2009-04-01 00:00:00
2009-05-01 00:00:00
2009-06-01 00:00:00
2009-07-01 00:00:00
2009-08-01 00:00:00
2009-09-01 00:00:00
2009-10-01 00:00:00
2009-11-01 00:00:00
2009-12-01 00:00:00
(12 filas)
pruebas=> CREATE OR REPLACE FUNCTION xcambio_fecha(TIMESTAMP)
pruebas-> RETURNS VARCHAR AS $body$
pruebas$> DECLARE
pruebas$> var_fecha alias FOR $1;
pruebas$> res_fecha record;
pruebas$> BEGIN
pruebas$> SELECT INTO res_fecha (CASE
pruebas$> WHEN EXTRACT(MONTH FROM var_fecha)=1 THEN (EXTRACT(DAY FROM var_fecha)||'-Ene-'||extra
ct(YEAR FROM var_fecha))::VARCHAR
pruebas$> WHEN EXTRACT(MONTH FROM var_fecha)=4 THEN (EXTRACT(DAY FROM var_fecha)||'-Abr-'||extra
ct(YEAR FROM var_fecha))::VARCHAR
pruebas$> WHEN EXTRACT(MONTH FROM var_fecha)=8 THEN (EXTRACT(DAY FROM var_fecha)||'-Ago-'||extra
ct(YEAR FROM var_fecha))::VARCHAR
pruebas$> WHEN EXTRACT(MONTH FROM var_fecha)=12 THEN (EXTRACT(DAY FROM var_fecha)||'-Dic-'||extr
act(YEAR FROM var_fecha))::VARCHAR
pruebas$> ELSE to_char(var_fecha,'dd-Mon-YYYY')
pruebas$> END) AS fecha;
pruebas$>
pruebas$> RETURN res_fecha.fecha::VARCHAR;
pruebas$> END;
pruebas$> $body$ LANGUAGE 'plpgsql';
CREATE FUNCTION
pruebas=> SELECT xcambio_fecha(fecha) FROM table1;
xcambio_fecha
---------------
1-Ene-2009
01-Feb-2009
01-Mar-2009
1-Abr-2009
01-May-2009
01-Jun-2009
01-Jul-2009
1-Ago-2009
01-Sep-2009
01-Oct-2009
01-Nov-2009
1-Dic-2009
(12 filas)
Como bien dice xdrtas la función now() devuelve un timestamp with time zone y mas que la fecha y la hora, también devuleve la zona horaria.
Código sql:
Ver originalpruebas=> SELECT now();
now
----------------------------
2009-11-17 08:17:50.046-05
(1 fila)
El -05 indica mi zona horaria Bogotá-Lima-Quito.
Como el campo que hemos declarado como entrada de la función es necesario hacer el respectivo casteo de timestamp with time zone a timestamp.
Código sql:
Ver originalpruebas=> SELECT xcambio_fecha(now());
ERROR: FUNCTION xcambio_fecha(TIMESTAMP WITH TIME zone) does NOT exist
LINEA 1: SELECT xcambio_fecha(now());
^
HINT: No FUNCTION matches the given name AND argument types. You may need TO ADD explicit TYPE CAST
s.
pruebas=> SELECT xcambio_fecha(now()::TIMESTAMP);
xcambio_fecha
---------------
17-Nov-2009
(1 fila)
saludos