2016-07-28 19 views
0

Ich mache etwas Arbeit, die Zeitreihendaten von den verschiedenen Tabellen zusammenbringt. Als Beispiel dieser Tabellenspalten für 1 Sekunde Zeitreihe hat und eine Spalte ‚nächste Stunde‘ wie:Postgresql WHERE timea = timeb, wie die Genauigkeit angeben?

"datetime"     "closesthourdatetime" 
"01/01/2005 00:30:00"  "01/01/2005 01:00:00" 
"01/01/2005 00:30:01"  "01/01/2005 01:00:00" 
"01/01/2005 00:30:02"  "01/01/2005 01:00:00" 

Wenn ich

SELECT time_series_only.closesthourdatetime 
    FROM measdata.time_series_only 
    WHERE time_series_only.datetime = time_series_only.closesthourdatetime 

ich nicht bekommen alle Ergebnisse laufen würde ich gehofft, im Gegensatz zum Laufen

SELECT DISTINCT time_series_only.closesthourdatetime 
    FROM measdata.time_series_only 

wo ich mache.

Ich vermute, das ist weil pgsql datetimes sind eigentlich numerische Werte mit den Zeiten als Teil eines Tages, so dass die Millisekunden möglicherweise nicht genau übereinstimmen, was mir egal war.

Gibt es eine Möglichkeit, dies zu fragen, aber geben Sie zur nächsten Sekunden- oder Minuten WHERE time_series_only.datetime = time_series_only.closesthourdatetime ohne verworren und vermutlich langsam Abfrage wie folgt? :

SELECT DISTINCT time_series_only.closesthourdatetime 
    FROM measdata.time_series_only 
    --WHERE 
    --time_series_only.datetime = time_series_only.closesthourdatetime 
    /*EXTRACT (YEAR FROM time_series_only.datetime) = EXTRACT(YEAR FROM time_series_only.closesthourdatetime) 
    AND EXTRACT (MONTH FROM time_series_only.datetime) = EXTRACT(MONTH FROM time_series_only.closesthourdatetime) 
    AND EXTRACT (DAY FROM time_series_only.datetime) = EXTRACT(DAY FROM time_series_only.closesthourdatetime) 
    AND EXTRACT (HOUR FROM time_series_only.datetime)  = EXTRACT(HOUR FROM time_series_only.closesthourdatetime) 
    AND EXTRACT (MINUTE FROM time_series_only.datetime) = EXTRACT(MINUTE FROM time_series_only.closesthourdatetime) 
    AND EXTRACT (SECOND FROM time_series_only.datetime) = EXTRACT(SECOND FROM time_series_only.closesthourdatetime) 
+1

'DATE_TRUNC()' kann das tun, was Sie wollen. –

+0

Was ist die nächste Stunde für '01/01/2005 00: 29: 59'? Ist es abgerundet oder hoch? –

+0

01.01.2005 00:29:59 würde abgerundet werden – SolarBrian

Antwort

2

Sie Ergebnisse mit diesem erhalten zu erwarten, wo Klausel:

WHERE datetime >= closesthourdatetime - INTERVAL '30 MINUTE' 
AND datetime < closesthourdatetime + INTERVAL '30 MINUTE' 

Hier closesthourdatetime 01/01/2005 01:00:00[01/01/2005 00:30:00, 01/01/2005 01:30:00) im Bereich alle Datetime wird passen, wo das zweite Datum exklusiv ist.

SQL Fiddle for test/edge cases