2008-12-04 8 views
16

Ich muss einige Intervalle hinzufügen und das Ergebnis in Excel verwenden.Wie konvertiert man ein Intervall wie "1 Tag 01:30:00" in "25:30:00"?

Seit

sum(time.endtime-time.starttime) 

das Intervall als „1 Tag 01.30.00“ gibt und dieses Format bricht mir das Excel-Sheet, dachte ich, es wäre schön, die Ausgabe wie „25:30 zu haben: 00 "aber in der PostgreSQL-Dokumentation keine Möglichkeit gefunden.

Kann mir hier jemand helfen?

Antwort

14

Da keine exakte Lösung für das Thema ist:

=> SELECT date_part('epoch', INTERVAL '1 day 01:30:00') * INTERVAL '1 second' hours; 
    hours 
----------- 
25:30:00 
(1 row) 

Quelle: Documentation

+0

Großartig! Ideale Lösung. –

21

Das einzige, was ich mit kommen kann (neben der Anzahl der Tage Parsen und das Hinzufügen von 24 zu den Stunden jedes Mal) ist:

mat=> select date_part('epoch', '01 day 1:30:00'::interval); 
date_part 
----------- 
    91800 
(1 row) 

Es wird Ihnen die Anzahl der Sekunden, die für in Ordnung sein kann übertreffen.

+0

Great stuff.Ich brauchte einen Weg, ein Absolutes aus einem Intervall zu nehmen, und der erste Schritt, den ich brauchte, war, das Intervall in Sekunden zu "werfen" und das tat einfach den Trick :) 'SELECT * FROM Tabelle ORDER BY abs (date_part ('epoch', ('2011-07-19 02:40:05' - table.time))) ' – Boro

18

Sie könnten EXTRACT verwenden, um das Intervall in Sekunden zu konvertieren.

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); 
Result: 442800 

Dann müssten Sie Ihre eigenen Berechnungen durchführen (oder lassen Sie Excel tun).

Beachten Sie, dass "1 Tag" nicht unbedingt 24 Stunden entspricht - PostgreSQL behandelt Dinge wie ein Intervall, das einen DST-Übergang umfasst.

+1

In einem (Zeitstempel | Datum | Zeit) mit Zeitzone, ja, aber, hum, ein Intervall hat keine Ahnung, wann es passiert Es hat also keinen DST-Übergang oder keine Schaltsekunden. – mat

+0

osm => select '2008-03-29T02: 00: 05 + 0200' :: Zeitstempel + '1 Tag' :: Intervall; ? Spalte? ------------------------ 2008-03-30 01: 00: 05 + 01 (1 Zeile) – mat

+3

Ich kann nicht autorisierend sein in der Sache, aber es scheint, als ob Postgres das Intervall als eine Reihe von Feldern speichert, nicht nur eine Ganzzahl, die zur Anzeige konvertiert wird. Je nachdem, wo es angewendet wird, wird es als unterschiedliche Anzahl von Sekunden interpretiert. Es dem Kontext zu berauben bedeutet, dass es Annahmen treffen muss. – slim

0

In Standard-SQL möchten Sie den Typ als INTERVAL HOUR TO SECOND darstellen, aber Sie haben einen Wert vom Typ INTERVAL DAY TO SECOND. Können Sie ein CAST nicht verwenden, um zu Ihrem gewünschten Ergebnis zu kommen? In Informix, würde die Notation entweder sein:

SUM(time.endtime - time.starttime)::INTERVAL HOUR(3) TO SECOND 

CAST(SUM(time.endtime - time.starttime) AS INTERVAL HOUR(3) TO SECOND) 

Ersteres ist, AFAIK, Informix spezifische Notation (oder zumindest nicht-Standard); Letzteres ist, glaube ich, eine SQL-Standardnotation.

0

Es kann getan werden, aber ich glaube, dass der einzige Weg, durch die folgende Monstrosität ist (vorausgesetzt, ist Ihren Zeitintervall Spaltennamen „ti“):

select 
       to_char(floor(extract(epoch from ti)/3600),'FM00') 
    || ':' || to_char(floor(cast(extract(epoch from ti) as integer) % 3600/60), 'FM00') 
    || ':' || to_char(cast(extract(epoch from ti) as integer) % 60,'FM00') 
    as hourstamp 
from whatever; 

sehen? Ich habe dir gesagt, es ist schrecklich :)

Es wäre schön gewesen, zu denken, dass

select to_char(ti,'HH24:MI:SS') as hourstamp from t 

würde gearbeitet, aber leider ist das HH24 Format nicht „absorbieren“, um den Überlauf über 24 oben kommt (aus dem Speicher rekonstruiert) aus einem Code, den ich einmal geschrieben habe. Um zu vermeiden, diejenigen von zarter Verfassung zu verletzen, verkapselte ich die oben genannten shenanigans in einer Ansicht ...

11

Wenn Sie wollten, dass postgres die HH: MM: SS Formatierung für Sie handhabt, nehmen Sie den Unterschied in den epoch Sekunden und wandeln sie in ein um in Sekunden Intervall skaliert: es

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime)) 
     * INTERVAL '1 SECOND' AS hhmmss 
+2

Sehr subtil. Dies ändert das Intervall von Tagen, Stunden, Minuten, Sekunden bis zu Sekunden, nach denen Sie einfach 'to_char (xxx, 'HH24: MI: SS')' tun können. – sayap

+0

+1 Sollte die Antwort sein ... fügen Sie es zu meinem nz Spickzettel –