Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/04/2010, 11:09
Avatar de webness
webness
 
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Calculo de fechas inicio y fin con psql

HOLA, estoy haciendo un procedimiento almacenado el cual me debe devolver un par de fechas en una cadena EJ: 2010-04-10,2010-05-09. para culquier fecha comprendida en este intervalo de tiempo.

el codigo es el siguiente:

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_get(INTEGER) RETURNS SETOF CHARACTER VARYING AS
  2. $BODY$
  3. DECLARE
  4.  
  5.     customer    ALIAS FOR $1;
  6.     sql_query   VARCHAR;
  7.     start_day   INTEGER;
  8.     days_to_use INTEGER;
  9.     dates       CHARACTER VARYING;
  10.     diferenre   INTEGER;
  11.     query_result t_list;
  12. BEGIN
  13.  
  14.     sql_query   :=  '   SELECT  INTO register start_day_to_use, (days_to_use - 1) AS days_to_use
  15.                         FROM    contract
  16.                         WHERE   state = $$'A'$$ AND fk_pk_customer = '||customer;
  17.  
  18.     EXECUTE sql_query;
  19.  
  20.     start_day   :=  register.start_day_to_use;
  21.     days_to_us  :=  register.days_to_use;
  22.  
  23.     SELECT INTO register EXTRACT (DAY FROM CURRENT_DATE)::INTEGER AS current_day;
  24.  
  25.     IF register.current_day <   start_day   THEN
  26.         diference   :=  start_day   -   register.current_day;
  27.         sql_query   :=  "SELECT INTO register((CURRENT_DATE - INTERVAL '1 MONTHS') + INTERVAL '"||diference||"DAYS')::date AS start_date";
  28.         EXECUTE  sql_query;
  29.         dates   :=  register.start_date;
  30.  
  31.         sql_query   :=  "SELECT INTO register (((CURRENT_DATE - INTERVAL '1 MONTHS') + INTERVAL '"||diference||"DAYS') + INTERVAL '"||days_to_use||"')::date AS end_date";
  32.         EXECUTE  sql_query;
  33.         dates   :=  dates   || ','|| register.end_date;
  34.     ELSE
  35.         diference   :=  register.current_day    - start_day;
  36.         sql_query   :=  "SELECT INTO register(CURRENT_DATE - INTERVAL '"||diference||" DAYS')::date AS start_date";
  37.         EXECUTE  sql_query;
  38.         dates   :=  register.start_date;
  39.  
  40.         sql_query   :=  "SELECT INTO register((CURRENT_DATE - INTERVAL '"||diference||" DAYS') + INTERVAL '"||days_to_use||" DAYS') AS end_date";
  41.         EXECUTE  sql_query;
  42.         dates   :=  dates   || ','|| register.end_date;
  43.     END IF;
  44.  
  45.     SELECT
  46.  
  47.  
  48.     RETURN dates;
  49. END $BODY$ LANGUAGE 'plpgsql' VOLATILE;
  50.  
  51. SELECT p_get(996);

en el primer query es para obtener el dia de cada mes en el cual se empieza un nuevo ciclo de facturacion para un cliente, junto con la cantidad de dias que se han de facturar 30 o 60.

de resto son para calcular la fecha de inicio y final dependiendo de esta cantidad de dias a facturar y el dia actual.

al momento de crear el procedimientos me salen estos errores:

Código de error 0, estado SQL42601: ERROR: una cadena separada por $ está inconclusa en o cerca de «$BODY$
DECLARE

customer ALIAS FOR $1»
Línea 1, columna 1

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 6, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «start_day»
Línea 7, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «days_to_use»
Línea 8, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «dates»
Línea 9, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «diferenre»
Línea 10, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «query_result»
Línea 11, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 12, columna 1

Código de error 0, estado SQL26000: ERROR: no existe la sentencia preparada «sql_query»
Línea 18, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «start_day»
Línea 20, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «days_to_us»
Línea 21, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «INTO»
Línea 23, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «IF»
Línea 25, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 27, columna 3

Código de error 0, estado SQL26000: ERROR: no existe la sentencia preparada «sql_query»
Línea 28, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «dates»
Línea 29, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 31, columna 3

Código de error 0, estado SQL26000: ERROR: no existe la sentencia preparada «sql_query»
Línea 32, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «dates»
Línea 33, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «ELSE»
Línea 34, columna 2

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 36, columna 3

Código de error 0, estado SQL26000: ERROR: no existe la sentencia preparada «sql_query»
Línea 37, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «dates»
Línea 38, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «sql_query»
Línea 40, columna 3

Código de error 0, estado SQL26000: ERROR: no existe la sentencia preparada «sql_query»
Línea 41, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «dates»
Línea 42, columna 3

Código de error 0, estado SQL42601: ERROR: error de sintaxis en o cerca de «IF»
Línea 43, columna 2

Código de error 0, estado SQL42703: ERROR: no existe la columna «return»
Línea 45, columna 2

Código de error 0, estado SQL42601: ERROR: una cadena separada por $ está inconclusa en o cerca de «$BODY$ LANGUAGE 'plpgsql' VOLATILE»
Línea 49, columna 1

Código de error 0, estado SQL42883: ERROR: no existe la función p_get(integer)
Línea 51, columna 1