Announcement

Collapse
No announcement yet.

Datumsdifferenzen kalkulieren

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

  • Datumsdifferenzen kalkulieren

    Hallo zusammen,

    habe erst vor kurzem angefangen mit SQL im Berufsumfeld zu arbeiten.

    Und zwar geht es um folgenden Sachverhalt:

    Eine Firma hat weltweit mehrere Lieferanten bei denen sie Ware einkauft. Nun geht es darum die Transport kosten zu senken und Mehrfachabholungen innerhalb eines kurzen Zeitraums (7 Tage) beim selben Lieferanten zu vermeiden. D.h. wenn zwischen zwei Orders weniger als 8 Tage Unterschied sind, muss man diese Orders zusammen abholen (d.h. eine Abholung statt zwei.) Ansonsten nicht.

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    Lieferant A Versendungsdatum Differenz Gruppieren ja/nein
    Order 1 01.02.2012 0 ja
    Order 2 01.02.2012 0 ja
    Order 3 08.02.2012 7 ja
    Order 4 15.02.2012 14 nein

    Wie sollte man die Syntax erstellen ? Mit datediff etc komme ich nicht weiter. Ist eine Gruppierung vorab notwendig?

    Vielen Dank vorab für die Hilfe

  • #2
    Deine Vorgaben sind etwas unscharf bzw widersprüchlich. Dein Text sagt nichts darüber aus, ob ausschließlich anhand der Bestelldaten oder mittels Stichtag gearbeitet wird. Wie Du aber an Deinen eigenen Beispieldaten siehst, könnte man auch die beiden letzten Sätze zusammenlegen.
    Wonach wird priorisiert? Was ist das Ausgangsdatum?
    Gruß, defo

    Comment


    • #3
      Originally posted by sql-frischling View Post
      Hallo zusammen,

      habe erst vor kurzem angefangen mit SQL im Berufsumfeld zu arbeiten.

      Und zwar geht es um folgenden Sachverhalt:

      Eine Firma hat weltweit mehrere Lieferanten bei denen sie Ware einkauft. Nun geht es darum die Transport kosten zu senken und Mehrfachabholungen innerhalb eines kurzen Zeitraums (7 Tage) beim selben Lieferanten zu vermeiden. D.h. wenn zwischen zwei Orders weniger als 8 Tage Unterschied sind, muss man diese Orders zusammen abholen (d.h. eine Abholung statt zwei.) Ansonsten nicht.

      Das Ergebnis sollte ungefähr wie folgt aussehen:

      Lieferant A Versendungsdatum Differenz Gruppieren ja/nein
      Order 1 01.02.2012 0 ja
      Order 2 01.02.2012 0 ja
      Order 3 08.02.2012 7 ja
      Order 4 15.02.2012 14 nein

      Wie sollte man die Syntax erstellen ? Mit datediff etc komme ich nicht weiter. Ist eine Gruppierung vorab notwendig?

      Vielen Dank vorab für die Hilfe

      Wie defo schon sagte, ist nicht ganz eindeutig, was Du sagst.

      Was für eine DB hast Du?
      Du wirst erst einmal die Differenzen zum Vortag berechnen müssen, mit PostgreSQL (und vermutlich ORA und einigen anderen) geht dies:

      Code:
      test=*# select * from orders ;
       id |   datum
      ----+------------
        1 | 2012-02-01
        2 | 2012-02-01
        3 | 2012-02-08
        4 | 2012-02-15
      (4 rows)
      
      test=*# select *, datum - lag(datum,1) over (order by id) from orders ;
       id |   datum    | ?column?
      ----+------------+----------
        1 | 2012-02-01 |
        2 | 2012-02-01 |        0
        3 | 2012-02-08 |        7
        4 | 2012-02-15 |        7
      (4 rows)
      Die Funktion berechnet je die Distanz zum Vorgänger, das könntest Du dann passend auswerten.


      Andreas

      Comment


      • #4
        Originally posted by akretschmer View Post
        test=*# select *, datum - lag(datum,1) over (order by id) from orders ;
        Vielleicht besser order by datum?

        Vermutlich wird hier MSSQL verwendet, das sollte es auf diese Art je nach Version auch können.
        Gruß, defo

        Comment


        • #5
          Originally posted by defo View Post
          Vielleicht besser order by datum?
          Ja, ähm, sah ja so aus, als ob die ID's als SERIAL (oder je nach DB-Implementation) vergeben werden. Falls sichergestellt ist, daß das Datum nicht verändert wird, ist ORDER BY für INT 'billiger'.

          Vermutlich wird hier MSSQL verwendet, das sollte es auf diese Art je nach Version auch können.
          Ah ja.

          Andreas

          Comment


          • #6
            Originally posted by akretschmer View Post
            Ja, ähm, sah ja so aus, als ob die ID's als SERIAL (oder je nach DB-Implementation) vergeben werden. Falls sichergestellt ist, daß das Datum nicht verändert wird, ist ORDER BY für INT 'billiger'.
            Billiger spielt aber hier kaum eine Rolle, da es erstmal fachlich korrekt sein soll oder? Ist sowieso wieder sinnlos die Diskussion, da der TE nicht dabei ist und seine Anforderung unsauber.
            Er bezeichnet in der Datenliste das Datum als "Versanddatum", spricht aber von Transportkosten des Abholens?
            So oder so, es liegt vermutlich tatsächlich ein Versanddatum != Bestelldatum vor. Die Order ID, selbst wenn sie per sequence erzeugt wird, taugt also nicht. Abgesehen davon das es normalerweise eine rein technische ID ist, die nicht zu workflow zwecken misbraucht werden sollte.



            Originally posted by akretschmer View Post
            Ah ja.
            Wegen DateDiff, gibts aber vielleicht auch woanders. MSSQL hat es jedenfalls und beherrscht mittlerweiles auch solche Analyse Befehle, wie Du sie aus Oracle vorgeschlagen hast.
            Gruß, defo

            Comment

            Working...
            X