PostgreSQL Datumsunterschied

8

Ich habe eine PostgreSQL-Funktion, die den Datumsunterschied berechnet:

%Vor%

Wenn Datumsangaben direkt subtrahiert werden, wird die Differenz berechnet. Aber in meinem Fall sind Daten in Variablen wie startDate und endDate vorhanden, was das Problem verursacht.

Wie kann ich Daten in Variablen subtrahieren?

    
Satish Sharma 28.12.2012, 15:16
quelle

3 Antworten

11

Debug

Was Ihre Funktion macht, könnte viel einfacher gemacht werden. Der eigentliche Grund für den Syntaxfehler ist hier:

%Vor%

Es sieht so aus, als ob du startDate auf timestamp werfen willst, was zunächst Unsinn ist, weil dein Parameter startDate bereits als timestamp deklariert ist.

Es funktioniert auch nicht. Ich zitiere das Handbuch hier :

  

Um syntaktische Mehrdeutigkeiten zu vermeiden, kann der Typ "String" -Syntax nur sein   Wird verwendet, um den Typ einer einfachen Literalkonstante anzugeben.

Es würde so funktionieren:

%Vor%

Aber das würde immer noch nicht viel Sinn machen. Sie sprechen von "Daten", definieren aber Ihre Parameter immer noch als timestamp . Sie könnten das, was Sie so haben, bereinigen:

%Vor%
  • DECLARE wird nur einmal benötigt.
  • date Spalten deklariert als richtiger Typ date .
  • Verwenden Sie keine Groß- / Kleinbuchstabenbezeichner, es sei denn, Sie wissen genau, was Sie tun.
  • Subtrahieren Sie start vom Ende , um eine positive Zahl zu erhalten, oder wenden Sie das Absolutwertoperator @ .
  • Seit das Subtrahieren von Daten (im Gegensatz zum Subtrahieren von Zeitstempeln , das ein interval ergibt) bereits integer ergibt, vereinfachen Sie:

    %Vor%

    Oder noch einfacher als plpgsql Zuweisung:

    %Vor%

Einfache Abfrage

Sie können die einfache Aufgabe mit einer einfachen Abfrage lösen - mit einer Unterabfrage:

%Vor%

Oder Sie könnten CROSS JOIN die Basistabelle zu sich selbst machen (1 Reihe von jeder Instanz, also ist das in Ordnung):

%Vor%

SQL-Funktion

Wenn Sie auf eine Funktion für diesen Zweck bestehen, verwenden Sie eine einfache SQL-Funktion:

%Vor%

Anruf:

%Vor%

PL / pgSQL-Funktion

Wenn Sie auf plpgsql bestehen ...

%Vor%

Gleicher Anruf.

    
Erwin Brandstetter 30.12.2012, 15:40
quelle
1

Ich würde die Abfrage so schreiben:

%Vor%

Der Unterschied zwischen der Verwendung von := und into im obigen Kontext besteht darin, dass die Verwendung von := Ihrer Abfrage einen einzelnen Wert zurückgeben muss. Wenn Sie into verwenden, kann Ihre Abfrage eine einzelne Zeile (d. H. Mehr als eine Spalte) zurückgeben.

Für eine vollständige Erklärung der Verwendung von select mit into und plpgsql sollten Sie Ссылка lesen . Insbesondere Abschnitt 39.5.3 der PostgreSQL-Dokumentation.

    
fbynite 29.12.2012 00:09
quelle
1

Brauchen Sie wirklich eine Funktion dafür?

Diese Abfrage würde auch funktionieren:

%Vor%     
Borys 31.12.2012 05:06
quelle