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

Taktabfrage

Dieses Thema im Forum "Oracle" wurde erstellt von FreeSepp, 25 Februar 2019.

  1. FreeSepp

    FreeSepp Benutzer

    Hallo,
    eine Maschine schreibt die Fertigungsdaten je Bauteil in eine Datenbank.
    Je Bauteil werden u.A. der Startzeitpunkt und der Endzeitpunkt dokumentiert.
    Jedes Bauteil bekommt einen eigenen Datensatz.
    Ich möchte die Taktzeit von Bauteil zu Bauteil abfragen, also von Start Bauteil 1 zu Start Bauteil 2 oder von Ende zu Ende, chronologisch sortiert.

    Danke & Grüße

    FS
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dabei können Dir Window-Funktionen helfen, via lag() z.B. kannst Du auf den n-ten Vorgänger (gemäß einder definierten Sortierung) zugreifen. Rest erklärt die Doku.
     
    Walter gefällt das.
  3. FreeSepp

    FreeSepp Benutzer

    Hallo,
    bekomme folgenden Fehler: " ORA-00932: inconsistent datatypes: expected DATE got NUMBER"
    --> was muss ich noch tun?
    select Bauteil_ID , LAG(RUNSTART,1,0)OVER (Order by RUNSTART) AS RUNSTART_previous
    ,RUNSTART - LAG(RUNSTART,1,0)OVER (Order by RUNSTART) as Tact_time
    from Bauteil_DB;
     
  4. castorp

    castorp Datenbank-Guru

    Der dritte Parameter für LAG() ist der default Wert der zurückgegeben wird, wenn es die vorherige Zeile nicht gibt. Du gibst da aber die Zahl 0 zurück - anhand der Fehlermeldung würde ich vermuten, das RUNSTART ein DATE ist - und das klappt natürlich nicht (Die zahl 0 (zero) ist kein valides Datum). Du kannst entweder NULL liefern:
    Code:
    lag(runstart, 1, null) over ...
    was aber das Gleiche ist wie
    Code:
    lag(runstart) over ...
    oder ein Datum was Du stattdessen verwenden willst:
    Code:
    lag(runstart, 1, date '1900-01-01') over ...
     
    Walter gefällt das.
  5. FreeSepp

    FreeSepp Benutzer

    Ja, Runstart ist ein DATE.
    Mit:
    "select LAG(RUNSTART,1, date '01.02.2019 08:33:00', 'DD.MM.YYYY HH24:MI:SS' ) OVER (Order by RUNSTART) AS RUNSTART_prev
    ,RUNSTART - LAG(RUNSTART,1,0)OVER (Order by RUNSTART) as Tact_time
    from …."
    bekomme ich nun folgende Meldung: ORA-01861: literal does not match format string
     
  6. FreeSepp

    FreeSepp Benutzer

    OK funktioniert!
    Ich bin mal kurz aufgestanden.....

    ,LAG(RUNSTART,1, null ) OVER (Order by RUNSTART) AS RUNSTART_prev
    ,round((RUNSTART - LAG(RUNSTART,1, null) OVER (Order by RUNSTART))*24*60,3) as Tact_time

    Vielen Dank euch beiden!
    LG, F.S.
     
  7. castorp

    castorp Datenbank-Guru

    Entweder Du verwendest eine Standard ANSI SQL Datumskonstante:
    Code:
    DATE '2019-02-01'
    oder Du verwendest Oracles to_date() Funktion wenn Du das Datum nicht im ISO Format angeben willst
    Code:
    to_date('01.02.2019 08:33:00', 'DD.MM.YYYY HH24:MI:SS')
    Du kannst nicht beides mischen.
     

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