Beim Vergleich der Daten in postgresql (Version 9.2.4 in Windows) war ich mit einem seltsamen Szenario konfrontiert. Ich habe eine Spalte in meiner Tabelle mit der Aufschrift update_date vom Typ 'Zeitstempel ohne Zeitzone'. Der Kunde kann dieses Feld nur mit Datum (dh: 2013-05-03) oder Datum mit Uhrzeit (dh: 2013-05-03 12:20:00) durchsuchen. Diese Spalte hat den Wert als Zeitstempel für alle aktuellen Zeilen und den gleichen Datumsteil (03.05.2013), jedoch den Zeitunterschied.
Wenn ich über diese Spalte vergleiche, erhalte 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 ich die erste Abfrage ermöglichen kann, um Ergebnisse zu erhalten. Ich meine, warum die dritte Abfrage funktioniert, aber nicht die erste?
Kann mir jemand dabei helfen? Danke im Voraus.
quelle
'2013-05-03'::date
und'1 day'::interval
) PostgreSQL spezifisch?CAST('2013-05-03' AS DATE) + CAST('1 day' AS INTERVAL)
(IIRC). YMMV über die Existenz und das Verhalten vonDATE
undINTERVAL
.::DATE
erster Teil der where-Klausel hinzugefügt werdenWHERE update_date::date = '2013-05-03'
so gut funktionieren und vielleicht etwas besser lesbar sein?update_date
wartimestamp without timezone
. Ich nahm einen Index für diese Spalte an. Ihr Prädikat würde diesen Index nicht verwenden.Wenn Sie
update_date >= '2013-05-03'
Postgres vergleichen, werden Werte in denselben Typ umgewandelt, um Werte zu vergleichen. Ihr '2013-05-03' wurde also in '2013-05-03 00:00:00' umgewandelt.Für update_date = '2013-05-03 14:45:00' lautet Ihr Ausdruck also wie folgt:
Das ist immer so
false
Um dieses Problem zu lösen, setzen Sie update_date auf
date
:quelle
update_date
Werte in der Tabelle im Vergleich zum Umwandeln des einzelnen Werts des Abfrageparameters ist äußerst ineffizient und stellt sicher, dass der Server keine Indizes für diese Spalte nutzen kann. Ich bin versucht, dies zu tun.SELECT * FROM my_table WHERE update_date >= '2013-05-03' AND update_date < '2013-05-04';
(Beachten Sie die Verwendung des 4. Mai eher als 3. und mit einem WENIGER ALS ZEICHEN eher als weniger als oder gleich.)Verwenden Sie den
range
Typ. Wenn der Benutzer ein Datum eingibt:Wenn der Benutzer Zeitstempel eingibt, benötigen Sie das
::date + 1
Teil nichthttp://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
quelle
Verwenden Sie Datumskonvertierung, um mit Datum zu vergleichen: Versuchen Sie Folgendes:
quelle