Nils Tholen: Probleme mit datumsberechnung

Hallo,
ich habe zwei probleme:

Ich bin gerade dabei eine wartungsliste über php zu schreiben:

Grundlage ist eine SQL Tabelle in der Wartungstermine gespeichert sind!

Der mitarbeiter soll wartungen durchführen
bei einigen teilen wöchentlich andere täglich wieder andere im zwei wochen rythmus usw usw.

Ich habe zur zeit eine möglichkeit, daß der wartungsplan mit festen daten (mehrzahl von datum)
 funktioniert und zB termine die in der vergangenheit liegen und nicht als erledigt abgehakt sind rot einfärbt!
nun soll aber auch eine warnung gegeben werden wenn dert termin um mehr als eine woche oder mehr als zwei wochen übershritten wird

das datum vergleiche ich mit

if ($line[datum] < date("Y-m-d])
  {ab hier die farbanweisungen
  }

--> wie lautet die funktion mit der ich kontrolliere ob der termin länger als eine woche länger als 2
wochen usw zurück liegt?

ich habe es mit funktionen nach dem prinzip ( if datum < ((aktuelles datum) - 7 Tage) ) versucht aber die
ergebnisse sind unsinnig! ich glaube auch es ist nicht so ein fach wie ich mir das vorstelle da zB 3. Novemver -7 tage der -4. November ist

schaltjahre etc müssen schliesslich auch berücksichtigt werden

das datumsformat das ich benutze lautet YYYY-MM-DD ( 22. Novemeber 2004 ist also 2004-11-22)
My sql überträgt das datum so es ist vom typ date
Hat jemand eine idee!

das zweite problem über das ich mir bisher eher weniger gedanken gemacht habe ist,
daß die termine ständig wiederholt werden sollen:

wenn ich also die wöchentliche  wartung durchgeführt habe soll zb schon das datum für die nächste wartung in
dieser zeile stehen

also wenn eine wartung am 13.11 gemacht wurde und es in der tabelle abgehakt wurde soll wenn das möglich ist
in dieser zeile oder unten an die tabelle angehängt
der 20.11 als neuer wartungstermin mit wartungsbeschreibung usw stehen

ich habe einzelne zeilen in dem das datum die zu wartende stelle und warungsbeschreibung usw stehen
die ich mit fetcharray über sql anzeige wie in myphp beschrieben

Ich realisiere das mit PHP/MYSQL und JAVA am liebste wäre mir wirklich eine lösung mit der Mysql tabelle da die
wartungen auch extern kontrolliert werden sollem

Schönen gruß und vielen dank schonmal

Nils

  1. Hi Nils!

    ich habe es mit funktionen nach dem prinzip ( if datum < ((aktuelles datum) - 7 Tage) ) versucht aber die
    ergebnisse sind unsinnig! ich glaube auch es ist nicht so ein fach wie ich mir das vorstelle da zB 3. Novemver -7 tage der -4. November ist

    Zu dem ersten Punkt:
    Da würde ich mit der SQL-Funktion DATE_ADD arbeiten.
    Z. B.:
      SELECT DATE_ADD("2004-03-02", INTERVAL -4 DAY);
      ergibt "2004-02-27"
    aber
      SELECT DATE_ADD("2003-03-02", INTERVAL -4 DAY);
      ergibt "2003-02-26"

    Näheres dazu:
    http://dev.mysql.com/doc/mysql/de/Date_and_time_functions.html#IDX1245

    Grüße
      Horst

  2. Hallo

    [...]
    schaltjahre etc müssen schliesslich auch berücksichtigt werden
    das datumsformat das ich benutze lautet YYYY-MM-DD ( 22. Novemeber 2004 ist also 2004-11-22)
    My sql überträgt das datum so es ist vom typ date
    Hat jemand eine idee!

    Habe mal ein paar Schnipsel zusammenkopiert, ich denke die könntest Du auf deine Bedürfnisse zurechtschneiden:

    // Umwandeln eines Datums in einen Timestamp
    $Year = substr($datum, 0, 4);
    $Month = substr($datum, 5, 2);
    $Day = substr($datum, 8, 2);
    $Time = mktime (12, 0, 0, $Month, $Day, $Year, 0 );

    // Timestamp von Heute
    $today_y = date("Y");
    $today_m = date("m");
    $today_d = date("d");
    $time_today = mktime (12, 0, 0, $today_m, $today_d, $today_y, 0 );

    // Timestamp "vor einer Woche"
    $TimeVor7Tagen = mktime (12, 0, 0, $today_m, $today_d-7, $today_y, 0 );

    Allgemein gesagt solltest Du dich mit den Funktionen

    date()
    mktime()

    beschäftigen.

    das zweite problem über das ich mir bisher eher weniger gedanken gemacht habe ist,
    daß die termine ständig wiederholt werden sollen:

    wenn ich also die wöchentliche  wartung durchgeführt habe soll zb schon das datum für die nächste wartung in
    dieser zeile stehen

    also wenn eine wartung am 13.11 gemacht wurde und es in der tabelle abgehakt wurde soll wenn das möglich ist
    in dieser zeile oder unten an die tabelle angehängt
    der 20.11 als neuer wartungstermin mit wartungsbeschreibung usw stehen

    Wo ist hierbei dein Problem? Einfach neue Zeile mit entsprechenden Datum einfügen.

    // Timestamp "in einer Woche"
    $TimeIn7Tagen = mktime (12, 0, 0, $today_m, $today_d+7, $today_y, 0 );

    Diesen umwandeln in dein Format, also YYYY-MM-DD, und mit den anderen Daten in deine DB eintragen (INSERT ...).

    Grüsse
    Frankie

    1. Hallo und erstmal danke für deine schnelle antwort!

      Also verstehen tu ich das soweit schon aber ein problem tut sich auf!

      ich will die tabellenzellen mit einer if schleife Rot färben und die werte auch irgendwie ausgeben:

      <td <? if(time_today <timevor7tagen)
              { bgcolor="#ff000"}
              else {} ?> >

      aber das funktioniert nicht ich habe es auch schon mit dollarzeichen vor time_today us versucht !
      wie arbeite ich denn mit den werten die ich oben in die variablen year day month time_today usw eingegeben habe!?

      ich werd aus den aufrufen by selfphp nicht schlau :-(

      bzw wie schreibe ich sie einfach auf??
      mit echo geht das auch nicht!

      echo $year etc

      Gruß
      Nils

      1. hi,

        aber das funktioniert nicht ich habe es auch schon mit dollarzeichen vor time_today us versucht !

        einfach nur irgendwas versuchen, ohne zu verstehen was man tut, ist meistens wenig zielführend.

        ich werd aus den aufrufen by selfphp nicht schlau :-(

        selfphp ist, meine meinung, für den allerwertesten.

        schlage dir unbekannte funktionen immer im richtigen manual nach, dort findest du neben den erklärungen auch meistens anwendungsbeispiele, und auch in den user contributed notes steckt viel nützliches.

        gruß,
        wahsaga

        --
        "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
        1. Hallo,

          hey wahsaga hab mich schon gefragt wo du bleibst ;-)!

          Grüß Dich

          Habs übrigens hinbekommen!

          Lag daran daß time_today < timevor7tagen in der normalen welt selten vorkommt! D'OH :-)

          aber das problem mit dem echo hab ich immer noch!

          Gruß
          Nils

          1. hi,

            aber das problem mit dem echo hab ich immer noch!

            bei der "problembeschreibung" aus dem posting vorher wundert mich das auch wenig.

            bzw wie schreibe ich sie einfach auf??
            mit echo geht das auch nicht!

            echo $year etc

            Was willst du jetzt eigentlich wissen?

            gruß,
            wahsaga

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      2. Hallo,

        Hallo und erstmal danke für deine schnelle antwort!

        Also verstehen tu ich das soweit schon aber ein problem tut sich auf!

        ich will die tabellenzellen mit einer if schleife Rot färben und die werte auch irgendwie ausgeben:

        <td <? if(time_today <timevor7tagen)
                { bgcolor="#ff000"}
                else {} ?> >

        Wie auch wahsaga schon anmerkte, solltest Du dich erstmal mit den Grundlagen beschäftigen.

        Aber ich will mal nicht so sein und dir trotzdem ein paar Tip(p)s geben:

        1. Namen von Variablen und Konstanten sind case-sensitive (timevor7tagen != timeVor7tagen)

        2. Variablen werden durch ein vorangestelltes $ gekennzeichnet, ohne vorangestelltes $ handelt es sich um Konstanten. timeVor7tagen ist also was ganz anderes wie $timeVor7tagen (obwohl sie natürlich den gleichen Wert haben _könnten_)

        3. Wenn Du was ausgeben möchtest, z.B. bgcolor="#ff000" (bgcolor ist außerdem nicht sonderlich schön, verwende CSS), geht das mit echo oder print(), etc.

        4. Wenn Du Hochkommata in deiner Ausgabe haben möchtest, dann musst Du diese in der Zeichenkette maskieren, z.B. durch ein vorangestelltes .

        if(time_today < timevor7tagen)

        Dieser Vergleich ist Käse.

        Du mußt die Datums aus deiner DB auslesen und die Differenz zu heute bestimmen. Wenn diese dann z.B. grösser als 7 Tage ist, dann färbe die TD irgendwie.

        ich werd aus den aufrufen by selfphp nicht schlau :-(

        selfphp ist Mist. Besorge dir das PHP-Manual.

        http://de3.php.net/manual/de/

        Grüsse
        Frankie

    2. Nohmal Ich, o ist hierbei dein Problem? Einfach neue Zeile mit entsprechenden Datum einfügen.

      // Timestamp "in einer Woche"
      $TimeIn7Tagen = mktime (12, 0, 0, $today_m, $today_d+7, $today_y, 0 );

      Diesen umwandeln in dein Format, also YYYY-MM-DD, und mit den anderen Daten in deine DB eintragen (INSERT ...).

    3. Sorry hab zu früh abgeschickt

      Wo ist hierbei dein Problem? Einfach neue Zeile mit entsprechenden Datum einfügen.

      // Timestamp "in einer Woche"
      $TimeIn7Tagen = mktime (12, 0, 0, $today_m, $today_d+7, $today_y, 0 );

      Diesen umwandeln in dein Format, also YYYY-MM-DD, und mit den anderen Daten in deine DB eintragen (INSERT ...).

      Ich müsste eine Kopie der gerade erledigten Zeile unten an die tabelle anheften

      oder

      das datum der gerade erledigten zeile auf das aktuelle ändern

      gruß
      Nils

      1. Hallo,

        Ich müsste eine Kopie der gerade erledigten Zeile unten an die tabelle anheften

        oder

        das datum der gerade erledigten zeile auf das aktuelle ändern

        Dann mach das doch genau so wie Du es beschrieben hast. Wo konkret ist dein Problem?

        Grüsse
        Frankie