Announcement

Collapse
No announcement yet.

Oracle SQL Datumdifferenz

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle SQL Datumdifferenz

    Hallo zusammen,
    ich möchte auf einer Oracletabelle die Zeit "Dienstbeginn" von jeweiligen Mitarbeitern abfragen und dabei rauskriegen, wer mehr als zwei Wochen gefehlt hat. Das heißt: Dienstbeginn2-Dienstbeginn1 > 14 Tage. Mein Problem dabei ist, dass die Bedingung sich auf die gleiche Spalte bezieht. Die Tabelle beinhaltet die Spalte Dienstbeginn als Datumfeld.
    Kann mir jemand dabei helfen?
    Danke im voraus!
    itunc

  • #2
    Also ich orakel mal:
    Originally posted by itunc View Post
    Dienstbeginn2-Dienstbeginn1 > 14 Tage.
    Ist die Theorie?
    Originally posted by itunc View Post
    Mein Problem dabei ist, dass die Bedingung sich auf die gleiche Spalte bezieht. Die Tabelle beinhaltet die Spalte Dienstbeginn als Datumfeld.
    Ist das Datenmodell?

    Demnach wäre Dienstbeginn2 irgendein neuer Satz in der Tabelle und Dienstbeginn1 ein älterer Satz (des gleichen Mitarbeiters)?

    Wenn das so ist, musst Du die Daten sortieren und mit Window Functions (Analytic Functions bei Oracle) auf die vorigen Datensätze zugreifen.
    Je nach Rest des Datenmodells, dass ich hier geraten hab, kann man vielleicht auch mit einfacher Sortierung davon kommen, aber für genauere Angaben müsstest Du Dich noch etwas outen (Tabellenstruktur, Selectstatements, ...).

    Du kannst auch einfach in der Doku nachschauen, wie man das mit analytic functions macht, das ist vermutlich so oder so am schnellsten, Stichworte wären z.B. Lag oder Lead.

    Mal zur Theorie:
    Ein Standard DB System kann nicht auf vorige oder nächste Datensätze zugreifen, um diese zu vergleichen. SQL arbeitet mengenorientiert, Teilmengen, Schnittmengen, Nichtmengen, Unmengen , ...
    Das ist etwas ganz anderes als ein Spreadsheet in Excel. Was man dort ganz simpel mit ein bisschen Mausrutschen macht, geht bei einer Menge nicht.
    Gute DB haben dafür (mittlerweile) Spracherweiterungen, siehe oben.
    Gruß, defo

    Comment


    • #3
      LEAD ist hier das Zauberwort:
      Code:
      create table t( c date);
       
      insert into t values (sysdate-20);
      insert into t values (sysdate-19);
      insert into t values (sysdate-1);
      insert into t values (sysdate);
      commit,
       
       
      select c "Dienstbeginn" ,round( (lead(c,1) over(order by c)-c),1) as "Tage zum nächsten Dienstbeginn" from t;
      Zuletzt editiert von dimitri; 02.07.2015, 11:35.
      Zitat Tom Kyte:
      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

      Comment

      Working...
      X