PostgreSQL Datums-Differenz
Ich habe eine PostgreSQL-Funktion zur Berechnung der Zeitdifferenz:
CREATE OR REPLACE FUNCTION testDateDiff () RETURNS int AS $BODY$
DECLARE startDate TIMESTAMP;
DECLARE endDate TIMESTAMP;
DECLARE diffDatePart int ;
BEGIN
Select evt_start_date From events Where evt_id = 5 INTO startDate ;
Select evt_start_date From events Where evt_id = 6 INTO endDate ;
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
RETURN diffDatePart;
END;
$BODY$
LANGUAGE plpgsql
COST 100
Wenn Daten abgezogen werden direkt anschließend die Differenz berechnet. Aber in meinem Fall Daten vorhanden sind, die Variablen als startDate
und endDate
, die das problem verursacht.
Wie kann ich subtrahieren enthaltenen Datumsangaben in Variablen?
- Wenn Sie zur Verfügung gestellt hatte, die syntax-Fehler-Nachricht, die Sie unweigerlich für diese Funktion definition, wäre es leichter gewesen. Auch wenn es nicht Sinn für Sie machen, es zumindest hilft uns ausschließen, andere zu verdächtigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Debug
Was Ihre Funktion ist, tun, getan werden könnte viel einfacher. Die eigentliche Ursache für die syntax-Fehler ist hier:
Es sieht aus wie Sie versuchen zu casten
startDate
zutimestamp
, das ist Unsinn um damit zu beginnen, weil Ihre parameterstartDate
erklärt wirdtimestamp
schon.Es auch nicht funktioniert. Ich zitiere die Anleitung hier:
Es würde Arbeit wie diese:
Aber, dass noch würde nicht viel Sinn machen. Sie sprechen über "dates", aber noch definieren Sie Ihre Parameter als
timestamp
. Sie könnte bereinigen, was Sie haben, wie diese:DECLARE
nur einmal.date
Spalten deklariert als richtigen Typdate
.@
.Da abzieht Termine (im Gegensatz zu subtrahieren Zeitstempel, das ergibt eine
interval
) bereits Erträgeinteger
vereinfachen zu:Oder noch einfacher als plpgsql Zuordnung:
Einfache Abfrage
Lösen Sie die einfache Aufgabe, mit dem eine einfache Abfrage mit einer Unterabfrage:
Oder Sie könnten
CROSS JOIN
die Basis-Tabelle auf sich selbst (1 Zeile aus jeder Instanz, also ist das ok):SQL-Funktion
Wenn Sie darauf bestehen, auf eine Funktion für den Zweck verwenden Sie eine einfache sql-Funktion:
Nennen:
PL/pgSQL-Funktion
Wenn Sie darauf bestehen, plpgsql ...
Gleichen Anruf.
Ich würde schreiben Sie die Abfrage wie diese:
Den Unterschied zwischen der Verwendung
:=
undinto
im Rahmen oben ist, dass mit:=
Ihre Abfrage einen einzelnen Wert zurückgeben müssen. Wenn Sieinto
Ihre Abfrage kann eine einzelne Zeile zurückgeben (D. H. mehr als eine Spalte).Für eine vollständige Erklärung der Verwendung
select
mitinto
und plpgsql Lesen Sie http://www.postgresql.org/docs/9.1/static/plpgsql-statements.html. Speziell, Abschnitt 39.5.3 der PostgreSQL-Dokumentation.SELECT INTO
funktioniert einwandfrei. Es gibt eine Reihe von anderen Problemen hier.select into
war nicht verkehrt.Brauchen Sie wirklich eine Funktion dafür?
Diese Abfrage würde auch funktionieren: