PostgreSQL: zwischen mit datetime
Verwende ich PostgreSQL 8.4.11 und finden seltsame Fehler. Wenn ich Abfrage:
SELECT "documents_document"."given_on"
FROM "documents_document"
WHERE (EXTRACT('month' FROM "documents_document"."given_on") = 1
AND "documents_document"."given_on"
BETWEEN '1-01-01 00:00:00' and '1-12-31 23:59:59.999999')
ORDER BY "documents_document"."created_on" DESC
Bekomme ich die Ergebnisse:
given_on
------------
2002-01-16
2011-01-25
2012-01-12
2012-01-12
2012-01-12
2012-01-20
2012-01-19
2012-01-13
2012-01-31
2012-01-16
2012-01-31
2012-01-12
...
Warum?
Ich würde erwarten, dass dates im Intervall 1-01-01 ... 1-12-31.
InformationsquelleAutor Denis SkS | 2012-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erwartet
1-01-01 ... 1-12-31
... aber wie ist PostgreSQL eigentlich wissen, was du damit meinst?String-Literale interpretiert werden gemäß der aktuellen locale-Einstellungen, insbesondere
lc_time
wenn der Zauber zutimestamp
oderdate
. Ich zitiere das Handbuch hier:In Ihrem Fall, den verstümmelten timestamp-literal
1-12-31 23:59:59
ist offensichtlich interpretiert als:Während Sie sich vielleicht erhofft hätte:
3 Optionen
Set
lc_time
zu einem Gebietsschema interpretiert literal in der gleichen Weise, wie Sie tun. Nicht sicher, dass es eins ist.Verwenden
to_timestamp()
zu interpretieren, das string-literal in einem gut definierten Weise - unabhängig von der aktuellen locale. Viel besser.Besser noch, verwenden Sie ISO-8601-format (
YYYY-MM-DD
) für alle datetime-Literale sind. Das ist eindeutig mit jedem locale.Rewrite-query
Endlich, deine query ist fehlerhaft, mit zu beginnen. Griff eine Reihe Abfrage anders. Schreiben Sie Ihre Abfrage:
Oder, einfacher noch:
Den neue range-Typen von PostgreSQL 9.2 kann für Sie von Interesse sein.
InformationsquelleAutor Erwin Brandstetter
SELECT '1-12-31 23:59:59.999999'::timestamp;
zurück2031-01-12 23:59:59.999999
offenbar Postgres nicht als Jahr ohne Jahrhundert als erstes element in das Datum.InformationsquelleAutor lanzz
Ihnen nicht sagen, in welches format Sie wollte es. So es gibt wieder das native format. Vielleicht ist Sie auch davon ausgegangen, dass jeder bezeichnet die Zeit, wie Sie es tun?
Haben Sie einen Blick auf die möglichen Formate. http://www.postgresql.org/docs/8.2/static/functions-formatting.html
InformationsquelleAutor Sjuul Janssen