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

bueno, ya logre resolver todo mi acertijo, la clave para concatenar en una variable, comillas + un valor variable + texto + comillas fue con: E'\''

AQUI PEGO EL CODIGO RESULTANTE DE MI PROCEDIMIENTO ALMACENADO Y COMENTADITO

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_get_range_date_to_billing(INTEGER) RETURNS VARCHAR 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.     state       CHARACTER VARYING;
  11.     diference   INTEGER;
  12.     myCursor    refcursor;
  13.     register    RECORD;
  14.     register2   RECORD;
  15.     aux     VARCHAR;
  16.     var_string  VARCHAR;
  17.     other_string    VARCHAR;
  18.    
  19. BEGIN
  20.  
  21.     --INICIO CONSULTA PARA OBTENER EL DIA DE INICIO DE LA FACTURACION Y LA CANTIDAD DE DIAS A FACTURAR 30 - 60
  22.     state       :=  $$'A'$$;
  23.     sql_query   :=  'SELECT  start_day_to_use, (days_to_use - 1) AS days_to_use
  24.                  FROM    contract
  25.                  WHERE   state = '||state||' AND fk_pk_customer =996';                 
  26.                    
  27.     OPEN myCursor FOR EXECUTE sql_query;
  28.     FETCH   myCursor INTO register;
  29.  
  30.     start_day   :=  register.start_day_to_use;
  31.     days_to_use :=  register.days_to_use;
  32.  
  33.     CLOSE   myCursor;
  34.  
  35.     --QUERY PARA OBTENER EL DIA ACTUAL
  36.     SELECT INTO register2 (EXTRACT (DAY FROM CURRENT_DATE)::INTEGER) AS current_day;
  37.  
  38.     --CALCULOS, CUANDO EL DIA ACTUAL ES MENOR QUE EL DIA DE INICIO DE LA FACTURACION
  39.     --INDICA QUE EL DIA ACTUAL PERTENECE AL MES SIGUIENTE DEL DIA DE INICIO DE LA FACTURACION
  40.     IF register2.current_day    <   start_day   THEN
  41.         diference   :=  start_day   -   register2.current_day;
  42.         aux     :=  $$'1 MONTHS'$$;
  43.         var_string  :=  E'\''||diference||E' DAYS\''; -- SE CONCATENA Y SE OBTIENE UN RESULTATE TIPO '8 DAYS'
  44.         sql_query   :=  'SELECT ((CURRENT_DATE - INTERVAL '||aux||') + INTERVAL '||var_string||')::date AS start_date';
  45.         OPEN myCursor FOR EXECUTE sql_query;
  46.         FETCH   myCursor INTO register;
  47.         dates   :=  register.start_date;
  48.         CLOSE myCursor;
  49.  
  50.         other_string    :=  E'\''||days_to_use||E' DAYS\'';  -- SE CONCATENA Y SE OBTIENE UN RESULTATE TIPO '30 DAYS'
  51.         sql_query   :=  'SELECT (((CURRENT_DATE - INTERVAL '||aux||') + INTERVAL '||var_string||') + INTERVAL '||other_string||')::date AS end_date';
  52.         OPEN myCursor FOR EXECUTE sql_query;
  53.         FETCH   myCursor INTO register;
  54.         dates   :=  dates   || ','|| register.end_date;
  55.         CLOSE myCursor;
  56.     ELSE -- EL MES ACTUAL ES EL MISMO DEL MES DEL DIA DE INICIO DE LA FACTURACION
  57.         diference   :=  register2.current_day   - start_day;
  58.         var_string  :=  E'\''||diference||E' DAYS\'';  -- SE CONCATENA Y SE OBTIENE UN RESULTATE TIPO '10 DAYS'
  59.         sql_query   :=  'SELECT (CURRENT_DATE - INTERVAL '||var_string||')::date AS start_date';
  60.        
  61.         OPEN myCursor FOR EXECUTE sql_query;
  62.         FETCH   myCursor INTO register;
  63.         dates   :=  register.start_date;
  64.         CLOSE myCursor;
  65.  
  66.         aux :=  E'\''||days_to_use||E' DAYS\'';  -- SE CONCATENA Y SE OBTIENE UN RESULTATE TIPO '30 DAYS'
  67.         sql_query   :=  'SELECT ((CURRENT_DATE - INTERVAL '||var_string||') + INTERVAL '||aux||')::date AS end_date';
  68.         OPEN myCursor FOR EXECUTE sql_query;
  69.         FETCH   myCursor INTO register;
  70.         dates   :=  dates   || ','|| register.end_date;
  71.         CLOSE myCursor;
  72.     END IF;
  73.  
  74.     RETURN dates;
  75. END $BODY$ LANGUAGE 'plpgsql' VOLATILE;
  76.  
  77. SELECT p_get_range_date_to_billing(996);

de todos modos no estoy 100% satisfecho con el codigo realizado, si alguien me puede dar ideas acerca de como optimizarlo y/o hacerlo mas entendible, seria genial.

Muchas Gracias.