2017-10-30 2 views
1

Ich habe Tabelle Test, die einschließlich Datum Spalte KartoffelDatum. Ich möchte Datensätze aufnehmen, indem ich nach Datum aus dieser Spalte abfrage. Und wenn ich nach dem Datum von Y .AA.AAAA zu X .AA.AAAA abfragt, bekam immer Aufzeichnungen von Y .AA.AAAA zu (X-1) .AA.AAA. Zum Beispiel suche ich vom 01.10.2017 bis zum 30.10.2017, aber ich habe Aufzeichnungen vom 01-29.10.2017 bekommen.Postgres: SQL-Abfrage nach Filter Datumsbereich

Ich versuche alles, was ich weiß, Event Unterabfragen, aber nichts half. Meine Versuche:

Select n1.potatoeDate 
    FROM (SELECT potatoeDate from test WHERE potatoeDate > '2017/05/07'::date) n1 
    WHERE n1.potatoeDate <= '2017/05/08'::date; 

    select * 
    from test 
    where potatoeDate between '2017/05/07' and '2017/05/08' 

    SELECT potatoeDate from test 
    where 
    potatoeDate >= '2017/05/07' AND 
    potatoeDate <= '2017/05/08' 

--little hack 
    SELECT potatoeDate from test 
    WHERE 
    potatoeDate >= '2017/05/07'::date 
    AND 
    potatoeDate <= ('2017/05/08'::date)+1; 

Nur die letzte kleine Hack Abfrage arbeiten. : |

Kann mir jemand helfen? :)

+0

Ist das nicht 'potatoeDate' vom Typ' timestamp'? Das würde das Verhalten erklären – Adam

+0

Ja ist es. Kannst du die Vernunft erklären? – newOne

+0

Siehe meine Antwort. Wenn es nicht ganz klar ist, lass es mich wissen. – Adam

Antwort

2

Ich denke, dass potatoeDate vom Typ timestamp ist.

Wenn Sie date mit timestamp vergleichen, ist die timestamp größer (später) wenn sie nur eine Sekunde hat. Versuchen Sie eine date zu timestamp zu werfen und sehen Sie, dass es 00:00:00 im Zeitfeld hat. So timestamp mit der Zeit anders als 00:00:00 wäre größer.

+0

Tatsächlich haben Sie Recht! Die einzige Lösung besteht darin, einen ganzen Zeitstempel hinzuzufügen, um eine interessante Stundenauswahl zu erhalten. Sie wissen, wie Sie es auf andere Weise lösen können? Ich meine, zum Beispiel: _where KartoffelDatum zwischen '2017/05/07': Zeitstempel und '2017/05/08 23: 59: 59'_ – newOne

+0

Wenn Sie nur in Reichweite Bereich in Tagen interessiert sind, dann schlage ich vor Fügen Sie 1 Tag bis zur oberen Grenze hinzu (genau wie im letzten Beispiel: 'patoatoDate <('2017/05/08' :: date) +1;'), oder eleganter '+ INTERVAL' 1 day' . – Adam

+0

Adam sehe meinen Beitrag unten, ich fand mehr bessere Lösung als Verkettung. Danke für Hilfe :) – newOne

1

Ich fand Lösung (Informationen von @Adam geholfen). :)

In dieser Situation seinen notwendigen Spaltennamen in denen Klausel Datum Art zu werfen. Wenn sie geändert werden, geben alle Abfragen die erwarteten Ergebnisse zurück.

Beispiel:

select * 
from test 
where potatoeDate::date between '2017/05/07' and '2017/05/08' 

SELECT potatoeDate from test 
where 
potatoeDate::date >= '2017/05/07' AND 
potatoeDate::date <= '2017/05/08' 
+0

Nun, es ist einfach zu schreiben, aber es ist teurer, nach Datenbank zu bewerten. Ich würde das nicht tun ... – Adam

+0

Es ist teurer, weil DB alle Datensätze auf das Datumsformat umwandeln muss, ook verstanden, wieder Sie haben Recht. So ist die einfache Verkettung in dieser Situation effektiver. – newOne