Quiero seleccionar personas de una tabla donde la fecha está dentro de un mes determinado.
Esto es lo que tengo hasta ahora, pero no funciona:
CREATE OR REPLACE FUNCTION u7() RETURNS character varying AS $BODY$ DECLARE data varchar=`data`; mes varchar=`2016-11-21`; incidencia varchar=`expulsions`; valor varchar; BEGIN EXECUTE `SELECT ` ||quote_ident(data) ||`FROM ` ||quote_ident(incidencia) ||` WHERE data IN(select date_part(`month`, TIMESTAMP $1))` INTO valor USING mes; return valor; END; $BODY$ LANGUAGE plpgsql; select * FROM u7();La sintaxis limpia para lo que está tratando de hacer podría verse así:
CREATE OR REPLACE FUNCTION u7() RETURNS TABLE (valor text) AS $func$ DECLARE data text := 'data'; -- the first 3 would typically be function parameters incidencia text := 'expulsions'; mes timestamp = '2016-11-21'; mes0 timestamp := date_trunc('month', mes); mes1 timestamp := (mes0 + interval '1 month'); BEGIN RETURN QUERY EXECUTE format( 'SELECT %I FROM %I WHERE datetime_column_name >= $1 AND datetime_column_name < $2' , data, incidencia) USING mes0, mes1; END $func$ LANGUAGE plpgsql; SELECT * FROM u7(); Obviamente, data no pueden ser una columna de texto y una columna de marca de tiempo o fecha al mismo tiempo. Uso datetime_column_name para la columna de marca de tiempo, suponiendo que sea una timestamp de tiempo de tipo de datos.
Aparte de varios errores de sintaxis, no use la construcción con date_part() . De esta manera, tendría que procesar cada fila de la tabla y no podría usar un índice en datetime_column_name , que mi alternativa propuesta sí puede.
Consulte las respuestas relacionadas para obtener una explicación: