Debug
Apa yang dilakukan fungsi Anda dapat dilakukan banyak lebih sederhana. Penyebab sebenarnya untuk kesalahan sintaksis ada di sini:
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
Sepertinya Anda mencoba mentransmisikan startDate
ke timestamp
, yang awalnya tidak masuk akal, karena parameter Anda startDate
dideklarasikan sebagai timestamp
sudah.
Ini juga tidak berfungsi. Saya mengutip manual di sini :
Itu akan bekerja seperti ini:
SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;
Tapi itu masih tidak masuk akal. Anda berbicara tentang "tanggal", tetapi tetap mendefinisikan parameter Anda sebagai timestamp
. Anda bisa bersihkan apa yang Anda miliki seperti ini:
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
hanya diperlukan sekali.date
kolom dideklarasikan sebagai jenisdate
.- Jangan gunakan pengidentifikasi huruf besar-kecil, kecuali Anda tahu persis apa yang Anda lakukan.
- Kurangi awal dari akhir untuk mendapatkan angka positif atau terapkan operator nilai absolut
@
. -
Sejak mengurangkan tanggal (sebagai lawan dari mengurangi stempel waktu , yang menghasilkan
interval
) sudah menghasilkaninteger
, sederhanakan menjadi:SELECT (startDate - endDate) INTO diffDatePart;
Atau bahkan lebih sederhana seperti tugas plpgsql:
diffDatePart := (startDate - endDate);
Kueri sederhana
Anda dapat menyelesaikan tugas sederhana dengan kueri sederhana - menggunakan subkueri:
SELECT (SELECT evt_start_date
FROM events
WHERE evt_id = 6)
- evt_start_date AS date_diff
FROM events
WHERE evt_id = 5;
Atau Anda bisa CROSS JOIN
tabel dasar untuk dirinya sendiri (1 baris dari setiap instance, jadi tidak apa-apa):
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;
Fungsi SQL
Jika Anda bersikeras pada suatu fungsi untuk tujuan tersebut, gunakan fungsi sql sederhana:
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$;
Telepon:
SELECT f_date_diff(5, 6);
Fungsi PL/pgSQL
Jika Anda bersikeras pada 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$;
Panggilan yang sama.