Berechnung von Datumsdifferenzen bei Oracle

Hallo,

ich habe ein kleines Problem bei einer SQL-Berechnung (DB ist Oracle 9i):

Gegeben ist ein Datum X und ein Datum Y. Es soll nun die Zeit zwischen X und Y ermittelt werden. Ganz „platt“ würde man ja irgendwie Datum X - Datum Y schreiben. Leider sollen aber die Wochenendtage aus der Differenz ausgeblendet werden. Soll heissen, wenn Datum X = Donnerstag und Datum Y = der darauffolgende Dienstag, dann ist der Abstand zwischen den beiden Tagen nach dieser Definition eben 3 und nicht 5.
Hat jemand von euch eine Idee, wie man das möglichst elegant lösen kann?

Level 2 wäre dann die Differenzberechnung auf Minutenebene, wobei nur die Zeiten zwischen 8 und 18 Uhr berücksichtigt werden sollen. Aber ich gehe jetzt einfach mal nach dem Prinzip „Teile und Herrsche“ vor und mache mir darüber später Gedanken :wink:.

Vielen Dank schonmal für Anregungen!

Kai

Ein Betriebskalendar
Ein eleganter Ansatz ist die Verwendung eines Betriebskalendars, einer Tabelle, die für jeden Jahrestag die Arbeitszeiten definiert. So sind Wochenenden und Feiertage leicht zu ermitteln. Mit einer Aggregations-Abfrage kannst du die gewünschten Werte zusammenfassen und die die (Arbeits-)Tage direkt zurück liefern lassen. Vorteil: man könnte so selbst Urlaubstage je Mitarbeiter einfach verwalten, auch halbe Tage (heilig Abend/Silvester) sind kein Problem Nachteil: der Betriebskalendar muss natürlich gepfelgt werden, sprich: die gesuchten Tage müssen im Kalendar enthalten sein.

Gruß Markus

hi!

tage:

  1. möglichkeit: eigene kalendertabelle

  2. mittels schleife (du gehst von datum x bis datum y, zählst einen zähler rauf, wenn der day of week ungleich ein sa oder so bzw. 6 od. 7 bzw. 1 od. 7 ist (je nach territory-einstellungen)

grüße,
tomh

ps: die minuten würde ich mittels funktion errechnen - hier wird’s schon heftiger

Hi!

Wenn um reine Unterscheidung Mo.-Fr. von Sa./So. geht, kann man das natürlich auch relativ einfach berechnen.

Man kann das Problem dabei in 2 Teilprobleme zerlegen:

  1. Mehrere Wochen liegen zwischen den zwei betrachteten Tagen. Dann rechnet man jede Woche zu 5 Tagen ein.
  2. Unter der Woche kann man einfach als Bezug einen Tag nehmen und die Differenzen beider Datumswerte innerhalb der Woche benutzen. Man nimmt der Einfachheit halber dann wohl den Montag.

Vorteil der Lösung: Man kann das gleiche Prinzip auch bei dem Minutenproblem später benutzen.
Nachteil: Feiertage sind so nicht zu berücksichtigen.

Folgende Einschränkungen hat die unten skizzierte Lösung:
a) date_1 also einfach Tage aufaddieren
Zeile 4: Datum 2 bzgl Wochentag liegt vor Datum 1 (z.B. Datum 1 Fr., Datum 2 Mi.) --> Es liegt ein Wochenende dazwischen
Ach so: Für das willkürlich gewählte Referenzdatum habe einen Montag gewählt, den 02.11.1812.

Ich habe die Lösung nun nicht ausführlich getestet. Ich habe einfach meine Überlegungen in die Abfrage „gegossen“.

Ciao

Johannes

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hmm… das muss ich erstmal verdauen. Bei der Anwendung mit meinen Testdaten kam schonmal 2 Tage statt wie erwartet 1 Tag raus.
Muss ich mir mal in Ruhe anschauen.

Aber vielen Dank erstmal für deine Bemühungen!!! *verneig*

Kai

Hallo!

Ich habe es gestern Abend erfolgreich mit ein paar Datumswerten ausprobiert. Bedenke die Voraussetzungen: date_1 muss älter sein als date_2. Ausserdem sollten beide neuer sein als das Referenzdatum (daher habe ich ein Datum aus dem 19. Jhrd. gewählt).

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]