2017-04-18 7 views
0

Ich versuche, ein True/False-Flag zu erstellen, das wahr ist, wenn zwei Datumsparametersätze einige überlappende Zeit oder Tage enthalten. Mein Verständnis ist, dass Postgres hat bereits eine Funktion für das genannte ‚ÜBERLAPPT‘, wie in dieser Dokumentation von 8,4 gesehen:Overlaps-Funktion in Redshift

[https://www.postgresql.org/docs/8.4/static/functions-datetime.html][1]

Wenn ich versuche, Überlappungen in Rotverschiebung zu verwenden, wie es scheint die Funktion funktioniert, finden Sie Beispiel unten:

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS 
    (DATE '2001-10-30', DATE '2002-10-30'); 

Allerdings, wenn ich versuche, es zu verwenden, um eine Spalte zu füllen, erzeugt er einen Fehler, siehe Beispiel unten, wo das Ergebnis immer wahr sein sollte, weil seine aa Zeit zu sich selbst zu vergleichen. In diesem Beispiel verwende ich Timestamp mit Zeitzone, aber ich habe es auch ohne Zeitzone versucht, und als nur Datum, die alle mit dem gleichen Fehler fehlschlagen.

CREATE TABLE date_table (
    variable VARCHAR, 
    date_start TIMESTAMP WITH TIME ZONE, 
    date_end TIMESTAMP WITH TIME ZONE 
) 
; 
INSERT INTO date_table VALUES ('max_date', TO_TIMESTAMP('2017/04/05 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2017/04/09 00:00:00', 
'YYYY/MM/DD HH24:MI:SS')) 
; 
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2016/04/06 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2016/04/15 00:00:00', 
'YYYY/MM/DD HH24:MI:SS')) 
; 
INSERT INTO date_table VALUES ('min_date', TO_TIMESTAMP('2015/04/01 
00:00:00', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2015/04/14 00:00:00', 
'YYYY/MM/DD HH24:MI:SS')) 
; 

SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS 
overlap_test 
FROM date_table dt 

Der Fehler, den ich bekommen ist unten aufgeführt:

An error occurred when executing the SQL command: 
SELECT dt.*, (date_start, date_end) OVERLAPS (date_start, date_end) AS overlap_test 
FROM date_table dt 

[Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.; 

Warnings: 
Function ""overlaps"(timestamp without time zone,timestamp without time zone,timestamp without time zone,timestamp without time zone)" not supported. 


Execution time: 0.07s 
Statement 1 of 1 finished 

1 statement failed. 
+1

Redshift basiert auf Postgres 8.0, daher ist das Lesen eines Handbuchs für eine spätere Version nicht sinnvoll. Eigentlich macht das Lesen des Postgres-Handbuchs keinen Sinn, Sie sollten das Redshift-Handbuch konsultieren: http://docs.aws.amazon.com/redshift/latest/dg/cm_chap_SQLCommandRef.html ("Überschneidungen" scheinen nicht dokumentiert zu sein) überhaupt dort) –

+0

In Bezug auf den Fehler: Ihr erstes Beispiel verwendet 'DATE' Werte. In Ihrem zweiten Beispiel verwenden Sie 'TIMESTAMP'-Werte. Wie die Fehlermeldung sagt, wird das scheinbar nicht unterstützt. –

+0

Hab mein Fehler, hier wäre der Link von 8.0 wo es gelistet ist. https://www.postgresql.org/docs/8.0/static/functions-datetime.html Es scheint eindeutig in Redshift verwendbar, da das erste Beispiel ein Ergebnis zurückgibt und "OVERLAPS" in der reservierten Liste der Rotverschiebung angezeigt wird: http: //docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html Es ist nur neugierig, dass Rotverschiebung scheint keine andere Dokumentation der Funktion zu haben. –

Antwort

0

Redshift auf Postgres basiert, aber es ist nicht Postgres. Ein Blick auf die Funktionen der Postgres-Dokumentation ist keine gute Idee. Die einzigen unterstützten Funktionen in Redshift sind explizit in der Redshift-Dokumentation aufgelistet, in diesem Fall werden nur these date and time functions unterstützt. OVERLAPS wird nicht unterstützt, daher die Warnmeldung, die Sie erhalten.

Ich bin mir nicht sicher, warum Ihre erste Select-Anweisung diese Warnung nicht auslöst, möglicherweise weil sie keine tatsächlichen Tabellen abfragt.

+0

Das ist hilfreich, ich werde aufhören, mit Funktionen zu experimentieren, die nicht in der Redshift-Dokumentation aufgeführt sind, Danke! –