PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Perbedaan tanggal PostgreSQL

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 jenis date .
  • 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 menghasilkan integer , 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat pendengar basis data dengan java?

  2. Postgres tidak mengembalikan lastval() dengan benar

  3. Ikhtisar Metode GABUNG di PostgreSQL

  4. Menemukan poligon tetangga - kueri postgis

  5. Migrasi rel untuk skema postgreSQL