Announcement

Collapse
No announcement yet.

Probleme mit Datumsrechnung

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

  • Probleme mit Datumsrechnung

    Hallo,

    ich befasse mich seit ein paar Wochen mit php und eigne mir die Sprache nach dem Motto learning on the project an.

    Ich kenne die meisten Befehle tue mich aber schwer diese sinnvoll zu verknüpfen :-)

    Folgende Problemstellung versuche ich aktuell zu lösen:

    Ich bekomme vom User 2 Daten (unterschiedlich lange Zeiträume)

    Wie kann ich herausbekommen, ob der angegebene Zeitraum mit einem Datum

    kollidiert??

    Ich habe in einer Datenbank eine Reihe von Daten. Und will dem User eine

    Fehlermeldung bringen, dass das Produkt im gewünschten Zeitraum nicht

    verfügbar ist.

    Hat von Euch jemand eine Idee für die Umsetzung?!? Ich hab's schon mit dem SQL-Befehl BETWEEN probiert, bin aber kläglich gescheitert :-)

    Danke schon mal für die Hilfe!

  • #2
    Hallo,

    da du es nicht weiter spezifiziert hast, gehe ich mal davon aus, das jedes Produkt-Tupel ein Feld GUELTIG_VON und GUELTIG_BIS besitzt, um zu kennzeichnen in welchem Zeitraum es verfügbar ist. Beide Felder sind vom Datentyp DATETIME. Um jetzt zu ermitteln, ob ein Produkt im Zeitraum A - B vorhanden ist, muß lediglich folgende Bedingung zutreffen:

    GUELTIG_BIS >= A AND GUELTIG_VON <= B

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      danke für Deine Antwort! Dann wäre es in der Tat sehr einfach... :-)

      Das Problem ist, dass ich eine Funktion möchte, wo jeder Tag einzeln gesperrt werden können.
      Meine Datenbank enthält also 365 potentielle Sperrmöglichkeiten.

      Wenn ich das wie von Dir beschrieben mache, dann kann es sein, dass jemand einen Zeitraum von 4 Tagen auswählt und ein Tag zwischendrin gesperrt ist. Doof oder? :-)

      Viele Grüße
      Sascha

      Comment


      • #4
        Originally posted by sascha_a View Post
        ...Das Problem ist, dass ich eine Funktion möchte, wo jeder Tag einzeln gesperrt werden können.
        Meine Datenbank enthält also 365 potentielle Sperrmöglichkeiten. ...
        Dann solltest du vielleicht dein Problem etwas näher spezifizieren. Diese Anforderung stand in deinem Ausgangspost so nicht .
        Mit spezifizieren meine ich z.B.:
        - Dein Datenmodell (in den relevanten Teilen)
        - Beispieldaten
        - gewünschtes Ergebnis
        - Code der nicht funktioniert bzw. nicht das gewünschte Ergebnis liefert
        - Hast du eher ein Problem mit dem PHP- oder dem SQL-Teil?

        Und was heißt "365 potentielle Sperrmöglichkeiten"? Im Ausgangspost sprichst du von "unterschiedlich lange Zeiträume" und "ob der angegebene Zeitraum mit einem Datum kollidiert" - wenn du jetzt jeden Tag einzeln sperren möchtest, dann sind das prinzipiell unendlich viele Sperrmöglichkeiten!

        Originally posted by sascha_a View Post
        ...Wenn ich das wie von Dir beschrieben mache, dann kann es sein, dass jemand einen Zeitraum von 4 Tagen auswählt und ein Tag zwischendrin gesperrt ist. Doof oder? :-)...
        Wieso Doof, daß wolltest du doch gerade wissen?
        Originally posted by sascha_a View Post
        ...Und will dem User eine Fehlermeldung bringen, dass das Produkt im gewünschten Zeitraum nicht verfügbar ist....
        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo Falk,

          Du hast vollkommen recht ich wusste selber noch nicht so recht, wie ich es umsetzen will.

          Also ich habe mir überlegt, dass es so klappen könnte:

          Abfrage sollte folgende Daten liefern

          SELECT * FROM sperrdaten2009 WHERE Einträge von Spalte4 bis Spalte7 != 0

          Ich suche also alle Zeilen/Einträge in der Datenbank, die von Spalte4 bis zur Spalte7 einen Wet ungleich null stehen haben.

          Ich habe nur das Problem., dass ich keinen Befehl kenne, der das so umsetzen kann. Gibt es da etwas???

          Bitte entschuldige, dass ich mich am Anfang so undeutlich ausgedrückt habe. Ich denk, dass es jetzt klar sein sollte, was ich für eine Problemstellung habe... :-)

          Viele Grüße
          Sascha

          Comment


          • #6
            Hallo Sascha,

            dafür mußt du die Bedingungen einfach nur UND verknüpfen:
            [highlight=sql]
            SELECT * FROM sperrdaten2009
            WHERE Spalte4 != 0
            AND Spalte5 != 0
            AND Spalte6 != 0
            AND Spalte7 != 0
            [/highlight]
            Anm.: Ich halte es für äußerst kontraproduktiv eine Tabelle nach Nutzdaten zu benennen! Was passiert nächstes Jahr? Legst du dann eine neue Tabelle sperrdaten2010 an und änderst alle betroffenen Abfragen?

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Falk,

              danke für Deine Mühe!

              Anm.: Ich halte es für äußerst kontraproduktiv eine Tabelle nach Nutzdaten zu benennen! Was passiert nächstes Jahr? Legst du dann eine neue Tabelle sperrdaten2010 an und änderst alle betroffenen Abfragen?
              --> Genau so will ich es :-)

              Der Code ist super, nur leider würde das ja bedeuten, dass jeder Zeitraum 4 Tage lang ist. Nur was mache ich in den Fällen, wenn er nur 2 Tage oder länger ist. Ich brauche irgendwas dynamisches...
              Irgendwelche Ideen?!? :-D

              Viele Grüße
              Sascha

              Comment


              • #8
                Originally posted by sascha_a View Post
                ...wenn er nur 2 Tage oder länger ist. Ich brauche irgendwas dynamisches...
                Irgendwelche Ideen?!? :-D
                Hi Namensvetter *g*,

                recht einfach. Wir bleiben mal beim einfachen Beispiel und machen es folgendermaßen (etwas ausführlicher, ja, es geht auch anders, aber wir wollen ja was lernen).

                PHP Code:
                // Rumpf der SQL-Anweisung bauen
                $_sql="SELECT * FROM sperrdaten2009"

                // Nun für jede Spalte iterieren
                for ($i=0;$i<anzahldergewünschtentage;$i++)
                {
                  
                // Bei der ersten Zeile mit WHERE...
                  
                if ($i==0$_sql .= "WHERE ".gewünschteSpalte." != 0 ";

                  
                // Bei allen anderen mit AND verknüpfen
                  
                else $_sql .= "AND ".gewünschteSpalte." != 0 ";
                }
                // SQL ausführen 
                Du musst nun nur noch deine Logik einbauen, wie du die Tage auswählst und diese in die For-Schleife einbauen, am besten als array, welches du direkt mit $i durchlaufen kannst. Am ende kommt dein beliebig langer SQL-String heraus (größer 0 sollten die Tage schon sein, dies bitte noch abfangen), den du dann ausführen kannst.
                Ich hoffe, das bringt dich weiter in die richtige Richtung...

                Sascha Presnac
                "A common mistake that people make
                when trying to design something completely foolproof
                is to underestimate the ingenuity of complete fools.
                "
                >>> Douglas Adams, Mostly Harmless
                -------------------------------------------------------
                Techcrawler.de | JaMT | deCHK | Extra-Bonus-Shopping.de | Scour

                Comment


                • #9
                  Originally posted by sascha_a View Post
                  ...Irgendwelche Ideen?!? :-D
                  Ja, aber ich würde das Problem von vornherein dynamischer angehen. (Vor dem Gedanken jedes Jahr eine Tabelle anlegen und Abfragen anpassen zu müssen gruselts mir )
                  Ich fasse mal deine Problemstellung so zusammen, wie ich sie verstanden habe:
                  Du hast irgendwelche Nutzdaten, die nicht an jedem Tag zur Verfügung stehen. Die Nutzdaten können an einzelnen Tagen oder in zusammenhängenden Zeiträumen gesperrt sein. Der Nutzer fragt einen Zeitraum oder ein einzelnes Datum ab und soll benachrichtigt werden, wenn in diesem Zeitraum eine Sperre vorliegt. Ist das so richtig?
                  Für den Ja-Fall würde ich das Modell auf Zeiträume auslegen, da ein einzelner Tag immer auch als VON/BIS abgebildet werden kann, wobei gilt VON=BIS.
                  Mein Datenmodell würde so aussehen:
                  Tabelle nutzdaten mit den Spalten id, daten1, daten2, ... PK:id
                  Tabelle sperren mit den Spalten id, nutzdaten_id, von, bis PK:id, FK:nutzdaten_id

                  Um jetzt zu ermitteln ob der Nutzdatensatz X im Zeitraum A-B an irgendeinem Tag gesperrt ist, kann folgende Abfrage verwendet werden:
                  [highlight=sql]
                  select count(*) anz_sperren
                  from sperren sp
                  where sp.nutzdaten_id = X
                  and sp.von <= B
                  and sp.bis >= A
                  [/highlight]
                  Nur wenn anz_sperren = 0 ist, dann ist der Zeitraum (oder bei A = B der einzelne Tag) komplett frei!
                  Das funktioniert allgemeingültig, ohne irgendwelche Faxen für einzelne Jahre oder Schleifen zur Ermittlung der abzufragenden Spalten, ohne Beschränckung der Länge der Zeiträume - eben dynamisch!

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment

                  Working...
                  X