Wie vergleicht man datesangaben in Datetime-Feldern in Postgresql?

Ich habe ein seltsames Szenario erlebt, als ich die data in postgresql (Version 9.2.4 in Windows) verglichen habe. Ich habe eine Spalte in meiner Tabelle sagen update_date mit dem Typ 'timestempel ohne timezone'. Der Kunde kann über dieses Feld nur mit date (zB: 2013-05-03) oder date mit Uhrzeit (zB: 2013-05-03 12:20:00) suchen. Diese Spalte hat den Wert als timestempel für alle aktuellen Zeilen und hat den gleichen datesteil (2013-05-03), aber den Unterschied in der time.

Wenn ich über diese Spalte vergleiche, bekomme ich unterschiedliche Ergebnisse. Wie die folgenden:

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found select * from table where update_date >= '2013-05-03' -> results found 

Meine Frage ist, wie kann ich die erste Abfrage möglich machen, um Ergebnisse zu erhalten, ich meine, warum die 3. Abfrage funktioniert, aber nicht die erste?

Kann mir jemand dabei helfen? Danke im Voraus.

@Nicolai hat das Casting korrekt und warum ist die Bedingung falsch für irgendwelche data. Ich schätze, du bevorzugst das erste Formular, weil du eine datesmanipulation in der Eingabezeile vermeiden willst, richtig? du brauchst keine Angst zu haben:

 SELECT * FROM table WHERE update_date >= '2013-05-03'::date AND update_date < ('2013-05-03'::date + '1 day'::interval); 

Wenn Sie update_date >= '2013-05-03' vergleichen, werden die Werte von postgres in denselben Typ umgewandelt, um Werte zu vergleichen. Ihr "2013-05-03" wurde also an "2013-05-03 00:00:00" vergeben.

Also für update_date = '2013-05-03 14:45:00' wird dein Ausdruck sein:

 '2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00' 

Das ist immer false

Um dieses Problem zu lösen, setze update_date auf date :

 select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result 

Verwenden Sie den range . Wenn der Benutzer ein date eingibt:

 select * from table where update_date <@ tsrange('2013-05-03', '2013-05-03'::date + 1, '[)'); 

Wenn der Benutzer timestempel eingibt, brauchen Sie nicht ::date + 1 Teil

http://www.postgresql.org/docs/9.2/static/rangentypes.html

http://www.postgresql.org/docs/9.2/static/functions-range.html