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:
Während Sie es sich erhofft hätten:
%Vor% Setzen Sie lc_time
auf ein Gebietsschema, das ein solches Literal auf die gleiche Weise interpretiert wie Sie. Nicht sicher, dass es einen gibt.
Verwenden Sie to_timestamp()
, um das String-Literal auf eine genau definierte Weise zu interpretieren - unabhängig vom aktuellen Gebietsschema. Viel besser.
Besser noch: Verwenden Sie das ISO 8601-Format ( YYYY-MM-DD
) für alle Datetime-Literale. Das ist eindeutig mit jedem Gebietsschema .
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.
>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. Ссылка
Tags und Links sql datetime postgresql postgresql-8.4