Announcement

Collapse
No announcement yet.

Zeit verschieben!

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

  • Zeit verschieben!

    Hallo,

    ich habe folgende Abfrage und Ergebnis:

    Code:
    WITH data AS
     (SELECT 80 nr, 39 id, to_date('17.06.2013 12:01','DD.MM.YYYY HH24:MI') datum FROM dual UNION ALL
      SELECT 81   , 51   , NULL                                                   FROM dual UNION ALL
      SELECT 82   , 14   , NULL                                                   FROM dual UNION ALL
      SELECT 83   ,  4   , NULL                                                   FROM dual UNION ALL
      SELECT 84   ,  4   , NULL                                                   FROM dual UNION ALL
      SELECT 85   ,  38  , NULL                                                   FROM dual UNION ALL
      SELECT 86   ,  27  , NULL                                                   FROM dual UNION ALL
      SELECT 87   ,  27  , NULL                                                   FROM dual)
      SELECT nr, id, 
             datum, 
             row_number() OVER (ORDER BY nr) rownr,
             min(datum)   OVER (ORDER BY 1)  mindat,
             min(datum)   OVER (ORDER BY 1) + (row_number() OVER (ORDER BY nr)-1) * 41/24/60 datneu
        FROM data
       ORDER BY nr; 
    
    
    nr	id	datum			rownr	mindat			datneu
    -------------------------------------------------------------------------------------
    80	39	17.06.2013 12:01:00	1	17.06.2013 12:01:00	17.06.2013 12:01:00
    81	51				2	17.06.2013 12:01:00	17.06.2013 12:42:00
    82	14				3	17.06.2013 12:01:00	17.06.2013 13:23:00
    83	4				4	17.06.2013 12:01:00	17.06.2013 14:04:00
    84	4				5	17.06.2013 12:01:00	17.06.2013 14:45:00
    85	38				6	17.06.2013 12:01:00	17.06.2013 15:26:00
    86	27				7	17.06.2013 12:01:00	17.06.2013 16:07:00
    87	27				8	17.06.2013 12:01:00	17.06.2013 16:48:00

    Es gibt nun eine zusätzlich Tabelle 'Ferien' die wie folgt aussieht:

    Code:
    von			bis
    -------------------------------------------------------------------------------------
    01.06.2013 06:00:00	01.06.2013 12:00:00
    05.06.2013 06:00:00	05.06.2013 12:00:00
    17.06.2013 14:00:00	17.06.2013 16:00:00
    24.06.2013 14:00:00	24.06.2013 16:00:00
    In der Tabelle Data wird das Datneu über das Datum und einer Addition von 41min gerechnet!
    Das soll auch weiter passieren nur die Zeiträume aus 'Ferien' sollen nach unten verschoben werden!
    Also würde meine neue Tabelle ab 17.06 14:00 alle Zeiten danach bis 16:00 nach unten verschieben und dann ab hier weiterrechnen!
    Code:
    nr	id	datum			rownr	mindat			datneu
    -------------------------------------------------------------------------------------
    80	39	17.06.2013 12:01:00	1	17.06.2013 12:01:00	17.06.2013 12:01:00
    81	51				2	17.06.2013 12:01:00	17.06.2013 12:42:00
    82	14				3	17.06.2013 12:01:00	17.06.2013 13:23:00
    83	4				4	17.06.2013 12:01:00	17.06.2013 17:02:00
    84	4				5	17.06.2013 12:01:00	17.06.2013 14:45:00
    85	38				6	17.06.2013 12:01:00	17.06.2013 15:26:00
    86	27				7	17.06.2013 12:01:00	17.06.2013 16:07:00
    87	27				8	17.06.2013 12:01:00	17.06.2013 16:48:00
    Wie könnte hier die Lösung aussehen??

    Gruß
    Zuletzt editiert von Snewi; 17.06.2013, 15:04.

  • #2
    Originally posted by Snewi View Post
    .. die Zeiträume aus 'Ferien' sollen nach unten verschoben werden!..[CODE]
    In SQL gibt es kein unten, verschieben auch nicht, standardmäßig nicht mal Vorgänger und Nachfolger.
    Vielleicht gelingt es Dir, Deine Frage zu präzisieren.

    Ich mach jetzt erstmal 2 Stunden Ferien.
    Gruß, defo

    Comment


    • #3
      In Oracle kann man mit LEAD und LAG auf Daten "vorheriger", bzw. "nachfolgender" Records zugreifen.

      Ich habe die Frage allerdings auch nicht verstanden.

      Gruss

      Comment


      • #4
        Guten Morgen,

        ich versuche es mal :-)

        1. Ich habe eine Tabelle 'Ferien' mit zur Zeit folgendem Inhalt der ständig erweitert werden kann!
        Code:
        von			bis                                Dauer
        -------------------------------------------------------------------------------------
        01.06.2013 06:00:00	01.06.2013 12:00:00       360
        05.06.2013 06:00:00	05.06.2013 12:00:00       360
        17.06.2013 14:00:00	17.06.2013 16:00:00       120
        24.06.2013 14:00:00	24.06.2013 16:00:00       120
        2. Ich habe eine Abfrage bei der ich ein Datum habe was ich für jede Zeile einfach um 41 min hochzähle!
        Code:
        WITH data AS
         (SELECT 80 nr, 39 id, to_date('17.06.2013 12:01','DD.MM.YYYY HH24:MI') datum FROM dual UNION ALL
          SELECT 81   , 51   , NULL                                                   FROM dual UNION ALL
          SELECT 82   , 14   , NULL                                                   FROM dual UNION ALL
          SELECT 83   ,  4   , NULL                                                   FROM dual UNION ALL
          SELECT 84   ,  4   , NULL                                                   FROM dual UNION ALL
          SELECT 85   ,  38  , NULL                                                   FROM dual UNION ALL
          SELECT 86   ,  27  , NULL                                                   FROM dual UNION ALL
          SELECT 87   ,  27  , NULL                                                   FROM dual)
          SELECT nr, id, 
                 datum, 
                 row_number() OVER (ORDER BY nr) rownr,
                 min(datum)   OVER (ORDER BY 1)  mindat,
                 min(datum)   OVER (ORDER BY 1) + (row_number() OVER (ORDER BY nr)-1) * 41/24/60 datneu
            FROM data
           ORDER BY nr; 
        
        
        nr	id	datum			rownr	mindat			datneu
        -------------------------------------------------------------------------------------
        80	39	17.06.2013 12:01:00	1	17.06.2013 12:01:00	17.06.2013 12:01:00
        81	51				2	17.06.2013 12:01:00	17.06.2013 12:42:00
        82	14				3	17.06.2013 12:01:00	17.06.2013 13:23:00
        83	4				4	17.06.2013 12:01:00	17.06.2013 14:04:00
        84	4				5	17.06.2013 12:01:00	17.06.2013 14:45:00
        85	38				6	17.06.2013 12:01:00	17.06.2013 15:26:00
        86	27				7	17.06.2013 12:01:00	17.06.2013 16:07:00
        87	27				8	17.06.2013 12:01:00	17.06.2013 16:48:00
        In diesem Fall das Datum 17.06.2013 12:01:00! Dieses wird jetzt für jede Zeile um 41min hochgezählt!
        Ergebnis in der Spalte datneu!
        So nun möchte ich mir die Tabelle Ferien anschauen und sehe das es hier die Einträge von 17.06.2013 14:00 bis 17.06.2013 16:00 mit der jeweiligen Dauer gibt!
        In der Spalte datneu der Tabelle 'Data' müsste ich jetzt schauen welcher Zeitstempel vor der vonZeit liegt und hier dann die Dauer + 41min dazurechnen! Danach dann wieder einfach mit 41min bis der nächste Datensatz aus der Tabelle kommt der passen könnte!

        Ist es jetzt verständlicher?

        Gruß

        Comment


        • #5
          Ist denn jetzt verständlicher?? Und muss ich es nochmal versuchen oder gibt es eher keine Lösung für das Problem??

          Gruß

          Comment


          • #6
            Originally posted by Snewi View Post
            Ist denn jetzt verständlicher?? Und muss ich es nochmal versuchen oder gibt es eher keine Lösung für das Problem??
            mmh, nicht wirklich.
            Originally posted by Snewi
            Danach dann wieder einfach mit 41min bis der nächste Datensatz aus der Tabelle kommt der passen könnte!
            a) ..Danach dann wieder einfach..
            b) ..nächster Datensatz..
            c) .. der Tabelle..
            d) .. passen könnte..
            zu a) danach: zeitlich? Reihenfolge? Welche? einfach: offenbar nicht einfach
            zu b) nächster Datensatz, nächster Datensatz unter welcher Sortierfolge?
            zu c) welche Tabelle?
            zu d) wie darf man sich das vorstellen?
            Ich kenne kein sql Äquivalent für "passen könnte"

            Versuch doch bitte mal sämtliche bestimmten und unbestimmten Artikel, allgemeine Worte wie "Tabelle", "Spalte", allgemeine Zeit und Reihenfolgenangaben usw usw. durch konkrete Angaben aus Deinem Beispiel zu ersetzen. (Konkrete Angaben sind z.B. vollständige Tabellennamen und Spaltennamen)
            Zusätzlich kannst Du in 2, 3 Sätzen versuchen zu beschreiben, was Du da inhaltlich erreichen möchtest. Ich persönlich bin kein großer Theoretiker, und bei einer Tabelle names "Ferien" in der Stunden eingetragen sind und Minuten berechnet werden, springt mein assoziativer Gehirnteil nicht an.
            Gruß, defo

            Comment


            • #7
              Hi,

              aber verstanden wurde hoffentlich schonmal, dass ich 2 Abfrageergebnisse habe die ich unter einen Hut bekommen will :-) oder?
              Vielleicht ertsmal ganz grob unter weglassen der unrelavanten Spalten und Einträge!

              In der ersten Abfrage gibt es eine Spalte (Datum) mit Zeitwerten die immer eine Differenz von 41 Min aufweisen!

              Code:
               
              	Datum
              -------------------------------------------------------------------------------------
              	17.06.2013 12:01:00
              	17.06.2013 12:42:00
              	17.06.2013 13:23:00
              	17.06.2013 14:04:00
                           17.06.2013 14:45:00
              	17.06.2013 15:26:00
              	17.06.2013 16:07:00
              	17.06.2013 16:48:00
              In der zweiten Abfrage gibt es eine Startzeit und eine Dauer
              Code:
              Start			 Dauer
              ------------------------------------
              01.06.2013 06:00:00	 360
              05.06.2013 06:00:00	 360
              17.06.2013 14:00:00	 20
              24.06.2013 14:00:00	 120
              Die fixe Differenz von 41min aus der ersten Abfrage die immer für jeden Datensatz zutrifft soll aufgeweitet werden, wenn es in der zweiten Abfrage ein Startzeit gibt die zwischen zwei Daten der 1 Abfrage liegt.

              Abfrage 2:
              17.06.2013 14:00:00 20

              liegt zwischen Abfrage 1:
              17.06.2013 13:23:00
              17.06.2013 14:04:00

              Hier soll jetzt der letzte Datensatz der beiden Datensätze genommen werden und hier die Dauer aus dem Datensatz der Abfrage 2 addiert werden!
              Daraus ergibt sich eine neue Zeit
              17.06.2013 14:24

              Hier werden jetzt noch 41 min dazuaddiert:
              17.06.2013 15:05


              Das neue Ergebnis sieht dann so aus: :-)
              Code:
              	Datum
              -------------------------------------------------------------------------------------
              	17.06.2013 12:01:00
              	17.06.2013 12:42:00
              	17.06.2013 13:23:00
              	17.06.2013 15:05:00
                           17.06.2013 15:46:00
              	17.06.2013 16:27:00
              	17.06.2013 17:08:00
              	17.06.2013 17:49:00
              Ich hab alles gegeben :-)

              Gruß

              Comment


              • #8
                Ich habe es zwar immer noch nicht ganz verstanden, aber hier mal ein Anfang wie man die beiden Abfragen kombinieren kann.
                Damit sollte alles was du brauchst in jeweils einem Record vorhanden sein.

                Das mit dem "Hier werden jetzt noch 41 min dazuaddiert" bekommst du hoffentlich selber hin.



                [highlight=sql]
                WITH t1 AS
                (SELECT TO_DATE('17.06.2013 12:01:00', 'dd.mm.yyyy hh24:mi:ss') AS DATUM FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 12:42:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 13:23:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 14:04:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 14:45:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 15:26:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 16:07:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 16:48:00', 'dd.mm.yyyy hh24:mi:ss') FROM dual),
                t2 AS
                (SELECT TO_DATE('01.06.2013 06:00:00', 'dd.mm.yyyy hh24:mi:ss') AS START_DATUM, 360 AS dauer FROM dual UNION ALL
                SELECT TO_DATE('05.06.2013 06:00:00', 'dd.mm.yyyy hh24:mi:ss'), 360 AS dauer FROM dual UNION ALL
                SELECT TO_DATE('17.06.2013 14:00:00', 'dd.mm.yyyy hh24:mi:ss'), 20 AS dauer FROM dual UNION ALL
                SELECT TO_DATE('24.06.2013 14:00:00', 'dd.mm.yyyy hh24:mi:ss'), 120 AS dauer FROM dual),
                t AS
                (SELECT datum, LEAD(datum, 1) OVER (ORDER BY datum) AS END_DATUM
                FROM t1)
                SELECT START_DATUM, dauer, datum, END_DATUM
                FROM t2
                RIGHT OUTER JOIN t ON t2.START_DATUM BETWEEN t.datum AND t.END_DATUM
                ORDER BY datum
                [/highlight]

                Code:
                START_DATUM                DAUER DATUM                 END_DATUM            
                --------------------- ---------- --------------------- ---------------------
                                                 17.06.2013 12:01:00   17.06.2013 12:42:00  
                                                 17.06.2013 12:42:00   17.06.2013 13:23:00  
                17.06.2013 14:00:00           20 17.06.2013 13:23:00   17.06.2013 14:04:00  
                                                 17.06.2013 14:04:00   17.06.2013 14:45:00  
                                                 17.06.2013 14:45:00   17.06.2013 15:26:00  
                                                 17.06.2013 15:26:00   17.06.2013 16:07:00  
                                                 17.06.2013 16:07:00   17.06.2013 16:48:00  
                                                 17.06.2013 16:48:00
                Gruss

                Comment


                • #9
                  Guten Morgen,

                  danke Wernfried für deine Unterstützung!! Hat super geklappt! Hab dann jetzt ein neues Ergebnis und dazu noch eine weitere Frage!

                  Ergebnis:
                  Code:
                  END_Datum	Start_Datum	END-Datum NEU	neues Ergebnis
                  25.06.2013 20:19			                          25.06.2013 20:19
                  25.06.2013 21:21			                          25.06.2013 21:21
                  25.06.2013 22:23			                          25.06.2013 22:23
                  25.06.2013 23:25			                          25.06.2013 23:25
                  26.06.2013 00:27			                          26.06.2013 00:27
                  26.06.2013 01:29			                          26.06.2013 01:29
                  26.06.2013 02:31			                          26.06.2013 02:31
                  26.06.2013 03:33			                          26.06.2013 03:33
                  26.06.2013 04:35			                          26.06.2013 04:35
                  26.06.2013 05:37	26.06.2013 06:00	26.06.2013 14:39	26.06.2013 14:39
                  26.06.2013 06:39			                          26.06.2013 15:01
                  26.06.2013 07:41			                          
                  26.06.2013 08:43			                         
                  26.06.2013 09:45
                  Jetzt habe ich ja mein Enddatum mit jeweils einer Differenz von jetzt 62min! Jetzt möchte aber der Zeile wo es ein neues End-Datum gibt mit diesem Wert ab hier mit 62min weiterrechnen!
                  Wie mache ich das?

                  Gruß

                  Comment


                  • #10
                    In Verbindung mit "LEAD" und "NVL" müsstest du es hinbekommen.

                    Mal eine generelle Frage: Sind diese Daten tatsächlich so in einer Tabelle vorhanden oder wäre es nicht einfacher wenn du eine vernünftige Schleife programmierst?

                    Gruss

                    Comment


                    • #11
                      Hallo,

                      das Ergebnis kommt aus folgender Abfrage!

                      Code:
                      SELECT  min(a.Ende_Datum) OVER (ORDER BY 1) + (row_number() OVER (ORDER BY a.seq)-1) * 62/24/60 AS Start_Datum,
                              b.Ende_Datum,
                              c.Putz_Start,
                              Start_Datum + (c.putz_dauer+62)/1440 as Ende_Neu,
                              nvl(start_datum + (c.putz_dauer+62)/1440, Start_Datum) AS neues_Ergebnis
                      FROM 
                      (SELECT * FROM v_chargenzeiten) a,
                      (SELECT a.seq, a.Start_Datum, LEAD(a.Start_Datum, 1) OVER (ORDER BY a.Start_Datum) AS Ende FROM (SELECT t2.seq, min(t2.Ende_Datum) OVER (ORDER BY 1) + (row_number() OVER (ORDER BY seq)-1) * 62/24/60 AS Start_Datum FROM (SELECT t1.seq, t1.Ende_Datum FROM v_chargenzeiten_elo t1) t2) a) b,
                      (SELECT a.putzschicht_von AS Putz_Start, a.putzschicht_bis AS Putz_Ende, (a.putzschicht_bis-a.putzschicht_von)*24*60 AS Putz_Dauer FROM Putzschichtplan_ELO a) c
                      WHERE b.seq = a.seq
                      AND c.Putz_Start(+) between Start_Datum and b.Ende_Datum
                      Wo müsste ich das hier mit einbauen?


                      Gruß

                      Comment


                      • #12
                        Guten Morgen,

                        da müsste ich doch die Zeile:

                        Code:
                         min(a.Ende_Datum) OVER (ORDER BY 1) + (row_number() OVER (ORDER BY a.seq)-1) * 62/24/60 AS Start_Datum,
                        verändern? Nur wie :-)

                        Gruß

                        Comment

                        Working...
                        X