Отстраняване на грешки
Това, което прави вашата функция, може да се направи много по-прост. Действителната причина за синтактичната грешка е тук:
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
Изглежда, че се опитвате да прехвърлите startDate
към timestamp
, което като начало е глупост, защото вашият параметър startDate
се декларира като timestamp
вече.
Също така не работи. Цитирам ръководството тук :
Това би работи по следния начин:
SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;
Но това все още няма да има много смисъл. Говорите за „дати“, но все пак дефинирайте параметрите си като timestamp
. Вие можете дезинфекцирайте това, което имате по този начин:
CREATE OR REPLACE FUNCTION f_date_diff()
RETURNS int AS
$BODY$
DECLARE
start_date date;
end_date date;
date_diff int;
BEGIN
SELECT evt_start_date FROM events WHERE evt_id = 5 INTO start_date;
SELECT evt_start_date FROM events WHERE evt_id = 6 INTO end_date;
date_diff := (endDate - startDate);
RETURN date_diff;
END
$BODY$ LANGUAGE plpgsql;
DECLARE
необходимо само веднъж.date
колони, декларирани като подходящ типdate
.- Не използвайте идентификатори със смесен регистър, освен ако не знаете точно какво правите.
- Извадете началото от края за да получите положително число или приложете оператора за абсолютна стойност
@
. -
От изваждането на датите (за разлика от изваждането на клеймото за време , което дава
interval
) вече даваinteger
, опростете до:SELECT (startDate - endDate) INTO diffDatePart;
Или дори по-просто като plpgsql присвояване:
diffDatePart := (startDate - endDate);
Проста заявка
Можете да разрешите простата задача с проста заявка - използвайки подзаявка:
SELECT (SELECT evt_start_date
FROM events
WHERE evt_id = 6)
- evt_start_date AS date_diff
FROM events
WHERE evt_id = 5;
Или можете да CROSS JOIN
основната таблица към себе си (1 ред от всеки екземпляр, така че е добре):
SELECT e.evt_start_date - s.evt_start_date AS date_diff
FROM events e
,events s
WHERE e.evt_id = 6
AND s.evt_id = 5;
SQL функция
Ако настоявате за функция за целта, използвайте проста sql функция:
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE sql AS
$func$
SELECT e.evt_start_date - s.evt_start_date
FROM events s, events e
WHERE s.evt_id = $1
AND e.evt_id = $2
$func$;
Обаждане:
SELECT f_date_diff(5, 6);
PL/pgSQL функция
Ако настоявате за plpgsql ...
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE plpgsql AS
$func$
BEGIN
RETURN (SELECT evt_start_date
- (SELECT evt_start_date FROM events WHERE evt_id = _start_id)
FROM events WHERE evt_id = _end_id);
END
$func$;
Същото обаждане.