Ich bin mit einem merkwürdigen Szenario konfrontiert, wenn ich Datumsangaben in postgresql (Version 9.2.4 in Windows) miteinander vergleicht. Ich habe eine Spalte in meiner Tabelle, beispielsweise update_date mit dem Typ 'timestamp without timezone'. Der Client kann über dieses Feld nur mit Datum (d. H. 2013-05-03) oder Datum mit Uhrzeit (d. H. 2013-05-03 12:20:00) suchen. Diese Spalte hat den Wert als Zeitstempel für alle Zeilen, die derzeit den gleichen Datumsteil (2013-05-03) haben, jedoch einen Zeitunterschied.
Wenn ich 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 kann ich die erste Abfrage ermöglichen, um Ergebnisse zu erzielen. Ich meine, warum die 3. Abfrage funktioniert, aber nicht die erste?
Kann mir jemand dabei helfen? Danke im Voraus.
@Nicolai ist beim Casting richtig und warum die Bedingung für alle Daten falsch ist. Ich denke, Sie bevorzugen das erste Formular, weil Sie Datumsmanipulationen an der Eingabezeichenfolge vermeiden möchten, richtig? Sie brauchen 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, wandelt postgres Werte in denselben Typ um, 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:
'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'
Dies ist immer false
Um dieses Problem zu lösen, verwandeln Sie update_date in date
:
select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result
Verwenden Sie den Typ range
. Wenn der Benutzer ein Datum eingibt:
select *
from table
where
update_date
<@
tsrange('2013-05-03', '2013-05-03'::date + 1, '[)');
Wenn der Benutzer Zeitstempel eingibt, benötigen Sie den ::date + 1
-Teil nicht
http://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
Verwenden Sie Datumsumwandlung, um mit Datum zu vergleichen: Versuchen Sie Folgendes:
select * from table
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')