No funciona como lo tienes. Una función de ventana
no se puede llamar así. Su variable de registro r
es como un cursor integrado en un FOR
círculo. Solo la fila actual del resultado es visible dentro del bucle. Tendría que integrar la función de ventana lag()
en el SELECT
inicial .
Pero dado que de todos modos está recorriendo las filas en un orden coincidente, puede hacerlo de otra manera.
Considere este ejemplo en gran parte reescrito. Devuelve en la primera fila infractora:
CREATE OR REPLACE FUNCTION q8(_day date)
RETURNS text AS
$BODY$
DECLARE
r record;
last_enddate date;
BEGIN
FOR r IN
SELECT *
-- ,lag(r.endDate) OVER (ORDER BY startDate) AS last_enddate
-- commented, because I supply an alternative solution
FROM periods
ORDER BY startDate
LOOP
IF _day BETWEEN r.startDate AND r.endDate THEN
RETURN 'Violates condition 1'; -- I return differing results
ELSIF _day BETWEEN (r.startDate - 7) AND r.startDate THEN
RETURN 'Violates condition 2';
ELSIF _day BETWEEN last_enddate AND (r.startDate) THEN
-- removed "- 7 ", that is covered above
RETURN 'Violates condition 3';
END IF;
last_enddate := r.enddate; -- remember for next iteration
END LOOP;
RETURN NULL;
END;
$BODY$ LANGUAGE plpgsql;
Más consejos
- Por qué el alias para
$1
? Lo nombraste_day
en la declaración ya. Cíñete a eso. - Asegúrese de saber cómo maneja PostgreSQL caso en identificadores . (Solo uso minúsculas).
- Puede simplemente sumar o restar números enteros (por días) de una fecha.