2017-02-02 1 views
1

Es gibt eine Syntax, die es ermöglicht, einen Timestamp in verschiedene Datumsteile zu transformieren, einschließlich der Unix-Epoche. Dies funktioniert wie folgt (in neuesten PostgreSQL mindestens):jooq "EXTRACT (EPOCH FROM [Feld])" Workaround?

SELECT EXTRACT(EPOCH FROM "ts") FROM... 

jedoch jOOQ scheint nicht diese Syntax zu unterstützen, wie durch this discussion belegte ich gefunden, was Issue #2132 auf die noch offenen Verbindungen auf der jOOQ GitHub.

Welche Problemumgehungen gibt es dafür? Wie kann ich dieses Verhalten innerhalb der jOOQ-Syntax emulieren (d. H. Ohne die gesamte Abfrage in reinem SQL schreiben zu müssen)?

+0

Wenn das Problem mit "EPOCH" ist, können Sie versuchen, "DAY" zu extrahieren und es mit 60 * 60 * 24 multiplizieren. –

+0

Ich würde dadurch ein gutes Stück Präzision verlieren. –

+0

'(Auszug ('DAY' von jetzt() - '1970-01-01') * 60 * 60 * 24 + Extrakt (Sekunden von jetzt()) + Extrakt (Minuten von jetzt()) * 60 + Extrakt (Stunden von jetzt an()) * 60 * 60) 'gibt genau dasselbe wie EXTRACT (EPOCH FROM now()) - siehe meine Antwort? .. –

Antwort

1

Sie immer auf plain SQL mit jOOQ zurückgreifen kann:

public static Field<Integer> extractEpochFrom(Field<Timestamp> field) { 
    return DSL.field("extract(epoch from {0})", Integer.class, field); 
} 
+0

Oh, das ist eigentlich ziemlich elegant, danke! –

0

Ich bin sicher, sollte es smth weniger monströs dann:

t=# select 
    (extract('DAY' from now()-'1970-01-01')*60*60*24 + extract(seconds from now())+ extract(minutes from now())*60 + extract(hours from now())*60*60) 
    - 
    extract(epoch from now()) 
; 
?column? 
---------- 
     0 
(1 row) 

Time: 0.315 ms 
+0

1: 'extract()' hat eine spezielle Syntax, es kann keine Werte vor 'from' akzeptieren, nur Bezeichner. 2. "Tag" ist der Tag des Monats, d. H. Es ist "2" im Fall von "2017-02-02", was weit entfernt von der Verwendbarkeit statt der "Epoche" ist. – pozs

+0

ah. Ich sehe - ich dachte, es akzeptiert nur EPOCH nicht. Vielen Dank –

+0

Gerade bemerkt, dass Sie "extrahieren" von einem "Intervall", das durch Subtraktion von 2 Zeitstempeln generiert wird. Dies ist ein Sonderfall, der ein Intervall mit der maximalen Auflösung 'Tage' erzeugt, so dass Ihre Formel funktionieren könnte. Aber normalerweise ist es gefährlich, Tage aus dem Zeitstempel/Intervall zu extrahieren, z. 'Extrakt (Tag aus Intervall '2 Jahre 2 Tage')' – pozs