Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

FOR PORTION OF - Umsetzung bei ORACLE

Dieses Thema im Forum "Oracle" wurde erstellt von Espina, 24 April 2016.

  1. Espina

    Espina Benutzer

    Hallo zusammen,
    ich betrachte im Moment die Möglichkeiten zur Speicherung temporaler Daten bei Oracle.
    Ich habe eine Tabelle mit Valid Time und möchte gerne ein Update machen. Folgenden Befehl habe ich bei DB2 ausprobiert und würde ihn gerne bei Oracle ebenfalls ausführen:

    UPDATE table1
    FOR PORTION OF business_time FROM '2016-08-01' TO '2016-10-10'
    SET coverage = 10000
    WHERE id = '1234'

    Gibt es eine Möglichkeit bei Oracle einen Teil einer Zeitperiode wie durch den Zusatz FOR PORTION OF anzugeben? Ich habe bisher leider keine gute Lösung finden können.

    Danke für die Hilfe!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Sollte doch ganz einfach über Where zu machen sein, oder? Hint: man kann Conditions logisch verknüpfen ...
     
  3. Espina

    Espina Benutzer

    Hallo akretschmer,
    das hatte ich mir auch gedacht, es sollen dann aber nach der Definition für FOR PORTION OF auch Datensätze drin sein, die nur zum Teil in dem Bereich liegen.
    Mit between ging es schon mal nicht und mit < und > schließe ich doch aus, dass Datensätze, die z.B. früher beginnen aber das Datum beinhalten mit drin sind, oder habe ich da noch einen Denkfehler?
    Danke für die Hilfe!
    Espina
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Auch das sollte via Where-Condition doch gegen, denke ich. Demo in PG unter Verwendung von RANGE-Typen:

    Code:
    test=*# select * from espina;
     id |  time_range   
    ----+-----------------------------------------------
      1 | ["2016-04-01 00:00:00","2016-06-01 00:00:00")
      2 | ["2016-05-01 00:00:00","2016-07-01 00:00:00")
      3 | ["2016-06-01 00:00:00","2016-08-01 00:00:00")
      4 | ["2016-07-01 00:00:00","2016-09-01 00:00:00")
    (4 rows)
    
    test=*# select * from espina where time_range && '(2016-05-15 00:00:00,2016-06-15 00:00:00]';
     id |  time_range   
    ----+-----------------------------------------------
      1 | ["2016-04-01 00:00:00","2016-06-01 00:00:00")
      2 | ["2016-05-01 00:00:00","2016-07-01 00:00:00")
      3 | ["2016-06-01 00:00:00","2016-08-01 00:00:00")
    (3 rows)
    
    test=*# select * from espina where time_range && '(2016-05-15 00:00:00,2016-05-25 00:00:00]';
     id |  time_range   
    ----+-----------------------------------------------
      1 | ["2016-04-01 00:00:00","2016-06-01 00:00:00")
      2 | ["2016-05-01 00:00:00","2016-07-01 00:00:00")
    (2 rows)
    

    Der && - Operator ist hier der OVERLAP - Operator, das ist ja das, was Du suchst, oder?
     
  5. Espina

    Espina Benutzer

    Hallo akretschmer,
    vielen Dank für die schnelle Antwort und die Beispiele.
    Leider funktioniert das bei meinem Beispiel so noch nicht. Mit der Valid-Time von SQL erstelle ich ja eine temporale Tabelle für den Anwendungszeitraum.
    Ich gebe beim Anlegen der Tabelle an, welchen Start- und welchen Endwert das "Intervall" hat.

    Beispiel:
    CREATE TABLE table1
    ( table1_id CHAR(4) NOT NULL;
    coverage INT NOT NULL,
    bus_start DATE,
    bus_end DATE,
    PERIOD FOR Business_Time (bus_start, bus_end));

    In der Tabelle selbst habe ich dann eine Spalte für bus_start und eine für bus_end.
    Business_Time taucht so ja dann nicht auf.
    Wenn ich versuche über die Business_Time abzufragen kriege ich die Fehlermeldung, dass der &&-Operator ein ungültiger relationaler Operator ist.

    Viele Grüße und einen schönen Abend!
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja, && ist ein spezieller Operator in PostgreSQL, der auf Überlappung prüft (bei Ranges oder auch bei geometrischen Objekten), kann schon gut sein, das selbst Oracle das so nicht kennt ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden