PostgreSQL: zwischen mit datetime

9

Ich benutze PostgreSQL 8.4.11 und finde seltsamen Fehler. Wenn ich abfrage:

%Vor%

Ich bekomme Ergebnisse:

%Vor%

Warum?

Ich würde Daten im Intervall 1-01-01 ... 1-12-31 erwarten.

    
Denis SkS 14.09.2012, 13:44
quelle

3 Antworten

20

Sie haben 1-01-01 ... 1-12-31 erwartet ... aber wie soll PostgreSQL wissen, was Sie damit meinen?

Zeichenfolgenliterale werden entsprechend Ihrer aktuellen Gebietsschemaeinstellungen interpretiert, insbesondere lc_time , wenn sie in timestamp oder date umgewandelt werden. Ich zitiere das Handbuch hier :

  

lc_time (Zeichenfolge)

     

Legt das Gebietsschema für die Formatierung von Datum und Uhrzeit fest, z. B. mit der Funktionsfamilie to_char. Akzeptable Werte sind   systemabhängig; Weitere Informationen finden Sie in Abschnitt 22.1. Wenn das ist   Variable wird auf die leere Zeichenfolge (das ist der Standardwert) dann die   Wert wird von der Ausführungsumgebung des Servers in einem geerbt   systemabhängiger Weg.

In Ihrem Fall wird das verstümmelte Timestamp-Literal 1-12-31 23:59:59 offensichtlich wie folgt interpretiert:

%Vor%

Während Sie es sich erhofft hätten:

%Vor%

3 Optionen

  1. Setzen Sie lc_time auf ein Gebietsschema, das ein solches Literal auf die gleiche Weise interpretiert wie Sie. Nicht sicher, dass es einen gibt.

  2. Verwenden Sie to_timestamp() , um das String-Literal auf eine genau definierte Weise zu interpretieren - unabhängig vom aktuellen Gebietsschema. Viel besser.

    %Vor%
  3. Besser noch: Verwenden Sie das ISO 8601-Format ( YYYY-MM-DD ) für alle Datetime-Literale. Das ist eindeutig mit jedem Gebietsschema .

    %Vor%

Abfrage neu schreiben

Schließlich ist Ihre Abfrage zunächst fehlerhaft. Behandeln Sie eine Bereichsabfrage anders. Schreiben Sie Ihre Anfrage neu:

%Vor%

Oder, noch einfacher:

%Vor%

Die neuen Bereichstypen von PostgreSQL 9.2 könnten für Sie von Interesse sein.

>     
Erwin Brandstetter 14.09.2012, 14:44
quelle
1

SELECT '1-12-31 23:59:59.999999'::timestamp; gibt 2031-01-12 23:59:59.999999 zurück, anscheinend betrachtet Postgres das Jahr ohne Jahrhundert nicht als erstes Element im Datum.

    
lanzz 14.09.2012 13:48
quelle
1

Sie haben nicht gesagt, in welchem ​​Format Sie es haben wollten. Es gibt also das ursprüngliche Format zurück. Vielleicht haben Sie sogar angenommen, dass jeder Zeit so bezeichnet wie Sie? Sehen Sie sich die möglichen Formate an. Ссылка

    
Sjuul Janssen 14.09.2012 13:52
quelle