it-swarm.com.de

Wie vergleicht man Datumsangaben in Datumsfeldern in Postgresql?

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.

115
user2866264

@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);
187
just somebody

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
30
Nicolai

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

6
Clodoaldo Neto

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')
0