Announcement

Collapse
No announcement yet.

Zeitanteil vor bestimmter Uhrzeit berechnen

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

  • Zeitanteil vor bestimmter Uhrzeit berechnen

    Hallo zusammen,
    nachdem ich beim der Suche nach Problemlösung für SQL Abfragen immer wieder über dieses Forum gestolpert bin würde ich eine aktuelle Frage doch direkt hier unterbringen in der Hoffnung, dass jemand eine zündende Idee haben könnte.
    Ich stehe aktuell vor der Aufgabe Zeiterfassungsdaten auszuwerten. Die wichtigste zu beantwortende Frage ist wie viele Zeiten vor und nach 12:30 Uhr liegen. Also wieviel Zeit entfällt auf den Vormittag und wie viel auf den Nachmittag.
    Das Quellsystem ist ein Buchungssystem welches immer nur einzelne Blöcke mit DatumVon und DatumBis (beides Datetime Felder) liefert.

    Beispiel:
    DatumVon = 2022-07-20 08:30:00.000
    DatumBis = 2022-07-20 13:30.00.000

    als Ergebnis sollte ich nun
    Vormittag = 4,00 Stunden
    Nachmittag = 1,00 Stunden
    haben.
    Umgekehrt kann es natürlich auch Blöcke geben, die komplett im Bereich von 00:00 - 12:30 oder 12:30 - 00:00 liegen, oder aber beide Werte innerhalb eines Blocks liegen 08:30 - 10:30 usw.

    Ich habe mit den Datepart, Datediff etc. Funktionen gespielt, komme dabei leider auf garkeinen grünen Zweig und auch google ist irgendwie keine Hilfe, wobei ich mich wundere, dass das offensichtlich eine ausgefallene Anforderung zu sein scheint.
    Ich hoffe jemand von euch hat eine zündende Idee und bedanke mich im Voraus.
    Zuletzt editiert von martin.thalheim; 25.07.2022, 14:04.

  • #2
    Wahrscheinlich wird man das mit etlichen case/when in einer Abfrage hinbekommen.
    Zielführender würde ich es sehen, das in 2 Stroed Proceduren zu machen. In 2 deshalb, weil eine Procedure nur einen Wert zurückgeben kann.
    Die Proveduren bekommen das VON und das BIS als Parameter und geben jeweils den Vormittagsanteil und den Nachmittagsanteil (ggf. 0) zurück
    Der Aufruf wäre dann
    select VormittagProc(VON,BIS) as Vormittag, NachmittagProc(VON,BIS) as Nachmittag from Tabelle
    Christian

    Comment


    • #3
      Code:
      wenn VON<12:30 dann
          wenn BIS>12:30 dann
              return 12:30-VON
          sonst
              return BIS-VON
      sonst
      return 0
      Gut, das passt auch in eine Abfrage, den Nachmittagsanteil analog dazu
      Christian

      Comment


      • #4
        Originally posted by Christian Marquardt View Post
        Code:
        wenn VON<12:30 dann
        wenn BIS>12:30 dann
        return 12:30-VON
        sonst
        return BIS-VON
        sonst
        return 0
        Gut, das passt auch in eine Abfrage, den Nachmittagsanteil analog dazu
        Vielen Dank für den Input, hat mir sehr geholfen den Knoten im Kopf zu lösen. Die datetime Felder in time zu casten und dann direkt mit "12:30" zu arbeiten habe ich in der Form nicht am Schirm gehabt.
        Finale SQL Syntax lässt es mich leider irgendwie nicht anfügen, muss ich daher weg lassen.

        Hatte zwischenzeitlich auch noch einen anderen Ansatz getestet, der gut funktioniert hat.
        Habe eine Hilfstabelle mit allen 1440 Minutenwerten pro Tag als String (also 0000, 0001 ... 2359) erstellt in der bei allem bis 1230 "V" und bei allen anderen "N" als Attribut hinterlegt. Aus den Timestamps VON/BIS habe ich dann die Zeiten als String extrahiert und über eine Subquery die Werte between VON/BIS für "V" und "N" aufsummiert. Funktioniert auch super und ist noch recht performant.

        Danke nochmal und schönen Abend
        Zuletzt editiert von martin.thalheim; 25.07.2022, 17:57.

        Comment

        Working...
        X