2016-08-18 6 views
0

Ich habe eine PSQL-Datenbank, die Felder für "start_time" und "end_time" in einer Tabelle hat.PostgreSQL Datumsbereich Abfrage

Diese werden aus einer JSON-Datei als Zeichenfolge in ein Textfeld in der Datenbank importiert. Die Zeichenfolge hat das folgende Format: yyyy-mm-dd hh:mm:ss Ich möchte eine Abfrage ausführen, um alle IDs einer Tabelle in der Datenbank anzugeben, die sich innerhalb eines bestimmten Datumsbereichs befinden.

Um dies zu tun, kann ich eines von zwei Dingen tun. Entweder kann ich eine Liste von Anfangs- und Endzeiten für einen bestimmten Datumsbereich abfragen, und mit der Rückkehr von dieser Abfrage eine separate Abfrage für die tatsächlichen Daten, die ich mit WHERE start_time = ANY ('{list of dates go here}') bekommen möchte. Die andere Option ist herauszufinden wie man das Format der Zeile in etwas vergleichbares ändert. Etwas wie WHERE start_time > beginning of date range AND end_time > end of date range, wenn die Felder keine Textfelder sind.

Der Datumsbereich wird von einer Datumszeitauswahl von einer Website stammen.

Dies könnte eine doppelte Post sein, aber nach stundenlanger Suche nach einer Lösung für diese beiden ist nichts entstanden. Also ist alles in die richtige Richtung hilfreich.

Dank

+0

Ich glaube, ich bin nicht sicher, was Ihre Frage ist hier. Fragen Sie, ob es besser ist, Zeitstempel als Zeitstempel oder als Text zu speichern? Oder fragen Sie, wie Sie Ihre Text-Timestamps in Timestamp-Timestamps umwandeln können? – jmelesky

+0

Fügen Sie keine Tags für Dinge hinzu, die nicht relevant sind. Das ist Postgres, nicht MySQL. – tadman

+0

Hinzugefügt Tags und Hintergrundinformationen für den Fall, dass es eine bessere Lösung zur Verarbeitung der Informationen auf der Server-Seite in Python oder auf der Client-Seite in der Javascript vor oder nach dem Datum in eine Abfrage eingegeben wurde. Postgres ist jedoch Magie und Boris 'Antwort ist genau das, wonach ich suche. –

Antwort

1

PostgreSQL sollte in diesem Fall auf Sie einfach gehen. Übergeben Sie die Zeichenfolge einfach an Timestamp und an den Vergleich.

Dies sollte aus dem Kasten heraus arbeiten:

WHERE start_time::timestamp > '2016-01-01' AND end_time::timestamp < '2016-12-31' 
+0

Faire Antwort. Nur zwei Korrekturen. 1. zweiter Vergleich sollte '<' not '>' sein. 2. Für die Leistung großer Datasets benötigen Sie möglicherweise Ausdrucksindizes für diese Textfelder. 'CREATE INDEX mytable_start_time_idx ON Mistabelle (start_time :: timestamp);' 'CREATE INDEX mytable_end_time_idx ON mytable (end_time :: timestamp);' – filiprem

+0

Alles, was Sie sagen, ist wahr. Index ist der richtige Weg zu gehen, und ja, ich habe die Abfrage von der Frage selbst kopiert den Fehler darin behalten :) –

+0

Ein weiterer Fehler in Ihrer Antwort. Timestamp filiprem

Verwandte Themen