PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разлика в датата на PostgreSQL

Отстраняване на грешки

Това, което прави вашата функция, може да се направи много по-прост. Действителната причина за синтактичната грешка е тук:

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$;

Същото обаждане.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв тип JOIN да използвате

  2. Недостатъци на таблица с твърде много колони

  3. Производителност на PostgreSQL - SELECT срещу съхранена функция

  4. SQL продължава да изпълнява заявки след нарушение на дублиран ключ

  5. Инсталирайте и се свържете с PostgreSQL 10 на Ubuntu 16.04