Announcement

Collapse
No announcement yet.

Wie macht man: 1 Datensatz mit 3 Tagen Dauer => 3 Datensätze mit 1 Tag Dauer

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

  • Wie macht man: 1 Datensatz mit 3 Tagen Dauer => 3 Datensätze mit 1 Tag Dauer

    Ich brauche dringend und schnell Hilfe bei einer Umwandlung von Datensätzen. Ob dies mit einer Tabellenwertfunktion, einer besonderen gespeicherten Prozedur, o.a. funktioniert ist dabei egal. Bitte sendet auch halbfertige Antworten, da die Zeit so drängt.
    Folgendes Problem: Es soll umgewandelt werden (A) zu (B).
    (A)
    Art Mitarbeiter Start Ende
    Urlaub Maier 07.01.2014 00:00 09.01.2014 00:00
    Urlaub Schmidt 27.02.2014 00:00 02.03.2014 00:00
    krank Herbst 11.01.2014 13:00 13.01.2014 00:00

    zu (B)
    Art Mitarbeiter Start Ende
    Urlaub Maier 07.01.2014 00:00 07.01.2014 00:00
    Urlaub Maier 08.01.2014 00:00 08.01.2014 00:00
    Urlaub Maier 09.01.2014 00:00 09.01.2014 00:00
    Urlaub Schmidt 27.02.2014 00:00 01.03.2014 00:00
    Urlaub Schmidt 28.02.2014 00:00 28.02.2014 00:00
    Urlaub Schmidt 01.03.2014 00:00 01.03.2014 00:00
    Urlaub Schmidt 02.03.2014 00:00 02.03.2014 00:00
    krank Herbst 11.01.2014 13:00 13.01.2014 00:00
    krank Herbst 11.01.2014 00:00 13.01.2014 00:00
    krank Herbst 11.01.2014 00:00 13.01.2014 00:00

    Wie erstellen ich also aus einem Eintrag zu 3 Tagen Urlaub die entsprechenden 3 Einträge zu je 1 Tag Urlaub (mit korrektem Datum).
    Die Datumsangaben sind datetime-Typen, können aber natürlich im Rahmen einer Sicht o.ä. auch onvertiert werden. Nur die krank-Einträge können eine Uhrzeit enthalten – und dies nur für den Anfangstag. Weitere Spalten zur Auslagerung von Zeit sind natürlich machbar. Ausgewertet wird später in Excel per SVERWEIS, daher werden einzelne Tageseinträge gebraucht. (Neben den Urlaubs- und Krank-Einträgen existieren sehr viele Tageseinträge für Arbeit oder auch Überstundenabbau ..)
    Falls dies in NICHT möglich ist mit SQL, aber jemandem eine Lösung in Access oder Excel einfällt, wäre das Problem auch gelöst.
    Bitte sendet auch halbfertige Antworten, da die Zeit so drängt.

  • #2
    Du kannst mit Excel oder Access per Datumsverarbeitung die Differenz zwischen den beiden Datumswerten geben lassen und daraus die Tage ermitteln und damit die Datensätze erzeugen
    Christian

    Comment


    • #3
      Originally posted by yatri View Post
      Ich brauche dringend und schnell Hilfe bei einer Umwandlung von Datensätzen
      ...
      Bitte sendet auch halbfertige Antworten, da die Zeit so drängt.
      Das nächste Mal vielleicht rechtzeitig loslegen oder den vorgesetzten und Kollegen vermitteln, dass solche Anforderungen nicht am 2. Weihnachtstag gestellt werden sollten.
      Halbfertig, Grenzwertanpassung, Offsets, Prüfung usw. kannst Du sicher noch selbst hinbekommen:

      Basisdaten
      [highlight=sql]

      -- Datenquelle
      create table TimeSpanSource
      (Art varchar(20),
      Mitarbeiter varchar(30),
      Start DateTime,
      Ende DateTime
      );

      --Testwert (etwas anders als vorgegeben)
      insert into TimeSpanSource values('Urlaub', 'Maier', convert(datetime,'29/12/13 00:00',3), convert(datetime,'09/01/14 00:00',3));
      insert into TimeSpanSource values('Urlaub', 'Schmidt', convert(datetime,'27/02/14 00:00',3), convert(datetime,'02/03/14 00:00',3));
      insert into TimeSpanSource values('krank', 'Herbst', convert(datetime,'11/01/14 13:00',3), convert(datetime,'13/01/14 00:00',3));


      -- Hilfstabelle, kann verbessert werden, ich kenne mich nicht so gut aus mit mssql
      -- die Tabelle kann im späteren Beispiel auch weggelassen werden,
      -- statt dessen das SQL zur Befüllung der Hilfstabelle in das Beispiel SQL am
      -- Ende einsetzen
      create table DayOfYearPivot (DOY integer);

      -- hier waren nicht genug sysobjects eingetrragen, also hoch 3, um auf 365 zu kommen
      -- Die gesamte Hilfstabelle kann durch jedes beliebige Statement ersetzt werden,
      -- das on the fly 365 aufsteigende Zahlen generiert.
      -- Abhängig von Server Version...

      -- ich hab das etwas entschärft und eine Dimension rausgenommen, nur noch 2xSysobjects abgefragt, sonst könnte es recht viel werden
      -- also hier werden nur 365 Datensätze benötigt, egal woher
      insert into DayOfYearPivot
      select Row from (
      SELECT ROW_NUMBER()
      OVER (ORDER BY s.OBJECT_ID,t.OBJECT_ID ) AS Row
      FROM sys.objects s, sys.objects t) x
      where Row<=365
      [/highlight]

      Beispielabfrage
      [highlight=sql]
      select y.*
      from (select t.*, cast(t.start + d.doy As Date) as tRange
      from TimeSpanSource t, DayOfYearPivot D
      -- where Art = 'krank'
      ) y
      where y.tRange > y.start
      and y.tRange <= y.ende
      [/highlight]

      oder so (durch die fehlende Konvertierung ergibt sich ein anderer Range)
      [highlight=sql]
      select t.*, cast(t.start + d.doy As Date) as tRangeVal
      from TimeSpanSource t, DayOfYearPivot D
      where t.start + d.doy >= t.start
      and t.start + d.doy <= t.ende
      --and Art = 'krank'
      [/highlight]

      frohes, neues Jahr!
      Zuletzt editiert von defo; 03.01.2014, 11:53. Reason: sys.objects Abfrage entschärft
      Gruß, defo

      Comment


      • #4
        http://www.php.de/datenbanken/105165...tag-dauer.html

        http://social.msdn.microsoft.com/For...um=sqlserverde
        Christian

        Comment


        • #5
          Ein Crossposting, ich fänd es ja gar nicht so schlimm, wenn die Leute wenigstens dazu schreiben würden, wo welcher Stand erreicht ist.
          Aber sowas geht dann bei dem ganzen Stress vermutlich auch unter...

          Dabei ist es ein schönes Beispiel für das Verständnis von SQL Mengen und Nicht-Mengen. Vielleicht kann es noch mal jemand brauchen, auch wenn der TE nie wieder reinschaut.
          Gruß, defo

          Comment

          Working...
          X