Wie konvertiere ich ein Intervall mit Postgres in mehrere Stunden?


161

Angenommen, ich habe ein Intervall wie

4 days 10:00:00

in postgres. Wie rechne ich das in eine Anzahl von Stunden um (in diesem Fall 106?) Gibt es eine Funktion oder sollte ich in die Kugel beißen und so etwas tun

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
Hinweis: Wenn Ihr Intervall Monate oder Jahre enthält, gibt es keine definierte Antwort auf die Anzahl der Stunden, da die Anzahl der Tage in einem Monat oder Jahr variiert. Also pass auf!
Teddy

Antworten:


313

Der wahrscheinlich einfachste Weg ist:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
Und vielleicht das Ergebnis auf eine Ganzzahl setzen oder
umwandeln,

64
Epoche extrahieren? Oh mein Gott, das wäre mir in einer Million Jahren nicht in den Sinn gekommen.
4.

4
SELECT EXTRACT (Epoche FROM my_interval / 3600) (Intervall unterstützt native 'Divide Integer', Ergebnis ist Intervall und Extraktionsergebnis ist Integer, nicht Float). So. Autocast / Floor fertig.
Offenso

19
Warnung: Das einfache Extrahieren der Epoche setzt implizit voraus, dass ein Monat = 30 Tage und ein Jahr = 365,25 Tage.
Teddy

@ Teddy was können wir damit machen? Wie vermeide ich dieses Problem und erhalte eine echte Anzahl von Epochen?
Asmox

18

Wenn Sie eine Ganzzahl möchten, dh die Anzahl der Tage:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

Toll! Vielen Dank dafür :) Dennoch habe ich festgestellt, dass wir dies jetzt so ändern können SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(ich verwende Seite 9.4), da age(ts)automatisch CURRENT_DATEnur ein Argument verwendet wird.
1111161171159459134

7
Warnung: Das einfache Extrahieren der Epoche setzt implizit voraus, dass ein Monat = 30 Tage und ein Jahr = 365,25 Tage.
Teddy

3

Um die Anzahl der Tage zu ermitteln, ist der einfachste Weg:

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

Soweit ich weiß, würde es dasselbe zurückgeben wie:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

27
Wenn Ihr Intervall ist '1 month 0 days', erhalten extract(day from …)Sie mit 0als Ergebnis.
Underyx

1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

Die ::intUmrechnung erfolgt nach dem Rundungsprinzip. Wenn Sie ein anderes Ergebnis wie Abrunden wünschen, können Sie die entsprechende mathematische Funktion wie z floor.


1

Wenn Sie ein Tabellenfeld konvertieren:

  1. Definieren Sie das Feld so, dass es Sekunden enthält:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Extrahieren Sie den Wert. Denken Sie daran, auf andere Weise zu besetzen . Wenn die Intervalle groß sind, können Sie eine unangenehme Überraschung erleben:

    EXTRACT(EPOCH FROM field)::int


Ich glaube nicht, dass Redshift den Datentyp INTERVAL unterstützt. Es wäre einfach GROSS.
Matt2000

-4
         select date 'now()' - date '1955-12-15';

Hier ist die einfache Abfrage, die die Gesamtzahl der Tage berechnet.


4
Das nimmt keinen Intervallwert an.
Teddy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.