Hannes: Berechnungen mit Zeit

Hy,

ich hätte da mal eine Frage wie ich mein Script besser lösen könnte, ich glaube dass es nicht optimal ist und bin über jede bessere Lösung dankbar!

Für jedes Heft gibt es einen Anzeigenschluss. Ein Kunde gibt eine Anzeige auf, die aktuelle Uhrzeit wird gemessen und somit gecheckt in welches Heft die Anzeige hineinkommt (mittels des Anzeigenschlusses als timestamp) - funktioniert schon, aber ich denke dass es zuviel Aufwand ist für jede Ausgabe ein elseif aufzubauen?

<CODE>
// AUSGABE xxxx
$time=time();
if($time <= 1173221999) {
 $issue='xxxx';
 $et='01.04.2007';
}

// AUSGABE xxxx
elseif($time >= 1173221999) {
 if($time <= 1175810399) {
  $issue='xxxx';
  $et='01.05.2007';
 }
}

USW.
</CODE>

Besten Dank,

Hannes

  1. hi,

    Für jedes Heft gibt es einen Anzeigenschluss. Ein Kunde gibt eine Anzeige auf, die aktuelle Uhrzeit wird gemessen und somit gecheckt in welches Heft die Anzeige hineinkommt (mittels des Anzeigenschlusses als timestamp) - funktioniert schon, aber ich denke dass es zuviel Aufwand ist für jede Ausgabe ein elseif aufzubauen?

    <CODE>
    // AUSGABE xxxx
    $time=time();
    if($time <= 1173221999) {
    $issue='xxxx';
    $et='01.04.2007';
    }

    // AUSGABE xxxx
    elseif($time >= 1173221999) {
    if($time <= 1175810399) {
      $issue='xxxx';
      $et='01.05.2007';

    Jedes Mal beide Grenzen abzufragen ist schon mal unsinnig - sofern die Intervalle wirklich aneinandergrenzen, wie in deinem Beispiel.

    Du könntest einfach die Grenzen in einem Array ablegen, und dieses dann so lange durchlaufen, wie der Vergleichswert nicht die nächste Grenze überschreitet.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Jedes Mal beide Grenzen abzufragen ist schon mal unsinnig - sofern die Intervalle wirklich aneinandergrenzen, wie in deinem Beispiel.

      Du könntest einfach die Grenzen in einem Array ablegen, und dieses dann so lange durchlaufen, wie der Vergleichswert nicht die nächste Grenze überschreitet.

      gruß,
      wahsaga

      Ich danke dir für deine Hilfe, nur leider verstehe ich dich nicht ganz bzw. den Array Aufbau. Hättest du einen kurzen Lösungsansatz?

      1. hi,

        bitte zitiere sinnvoll, und nicht wahllos alles.

        Ich danke dir für deine Hilfe, nur leider verstehe ich dich nicht ganz bzw. den Array Aufbau. Hättest du einen kurzen Lösungsansatz?

        $intervallGrenzen = array(timestamp1, timestamp2, ..., timestamp4711);

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. Hello,

        Hättest du einen kurzen Lösungsansatz?

        kürzer gings nicht

        <?php   ### find_ausgabe.php ###

        findet die Nummer der Ausgabe, für die der Anzeigenschluss noch ausreicht.

        $_ausgaben[1] = 20070101;
        $_ausgaben[2] = 20070110;
        $_ausgaben[3] = 20070120;
        $_ausgaben[4] = 20070130;
        $_ausgaben[5] = 20070209;
        $_ausgaben[6] = 20070219;
        $_ausgaben[7] = 20070301;

        $abgabetermin = 20070208;

        asort($_ausgaben);
        $ausgabe = 0;

        foreach($_ausgaben as $key => $val)
        {
          if ($val > $abgabetermin) break;
        }

        echo "<pre>\n";
        echo "<p>Ausgabe: $key<p>\n";
        print_r($_ausgaben[$key]);
        echo "<pre>\n";

        ?>

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

  2. Hello,

    stehen die Werte in eienr Datenbank?

    select min(az) from ausgaben where az > $abgabetermin;

    Dann hast Du den zuständigen Anzeigenschluss

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. select min(az) from ausgaben where az > $abgabetermin;

      Hallo,

      danke für deine Hilfe. Ja es steht in einer MySQL Datenbank.

      number | year | closing_date | date_of_publication
      -------|------|--------------|---------------------
      05     | 2007 | 1175724000   | 1177970400
      06     | 2007 | 1179179999   | 1181512800
      07     | 2007 | 1181080799   | 1183240800

      Aber
      $abfrage = "SELECT min(closing_date) FROM issue WHERE closing_date > $time";

      gibt mir nur etwas leeres zurück.

      1. Hello,

        select min(az) from ausgaben where az > $abgabetermin;

        Hallo,

        danke für deine Hilfe. Ja es steht in einer MySQL Datenbank.

        number year closing_date date_of_publication
        05 2007 1175724000 1177970400
        06 2007 1179179999 1181512800
        07 2007 1181080799 1183240800

        Aber
        $abfrage = "SELECT min(closing_date) FROM issue WHERE closing_date > $time";

        gibt mir nur etwas leeres zurück.

        Was gibt denn wohl

        "select closing_date from issue;"

        zurück?

        Und wofur gibt es "UNIX_TIMESTAMP()"?

        http://dev.mysql.com/doc/refman/4.1/en/timestamp-pre-4-1.html

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Was gibt denn wohl

          "select closing_date from issue;"

          zurück?

          Und wofur gibt es "UNIX_TIMESTAMP()"?

          http://dev.mysql.com/doc/refman/4.1/en/timestamp-pre-4-1.html

          Es tut mir leid, aber ich verstehe nicht was du meinst.

          1. Hello,

            "select closing_date from issue;"

            Es tut mir leid, aber ich verstehe nicht was du meinst.

            Hast Du denn mal obige Abfrage durchgeführt und Dir angeschaut, was dabei herauskommt?

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hast Du denn mal obige Abfrage durchgeführt und Dir angeschaut, was dabei herauskommt?

              Nichts, bzw. ein leer ;)

              1. Hello,

                Hast Du denn mal obige Abfrage durchgeführt und Dir angeschaut, was dabei herauskommt?

                Nichts, bzw. ein leer ;)

                Wie jetzt?
                Bei                 select closing_date from issue;

                kommt nichts heraus?
                Dann sind wohl gar keine daten in Deiner Tabelle?

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Sorry, hatte das min() noch drumherum.
                  Bei
                  SELECT closing_date,number FROM issue WHERE closing_date > $time

                  kommt 0607 raus, also der richtige wert für das aktuelle datum.

                  was hatte das mit dem min() auf sich?

                  danke für deine hilfe

                  1. Sorry, hatte das min() noch drumherum.
                    Bei
                    SELECT closing_date,number FROM issue WHERE closing_date > $time

                    kommt 0607 raus, also der richtige wert für das aktuelle datum.

                    was hatte das mit dem min() auf sich?

                    danke für deine hilfe

                    halt stop! nicht der richtige wert... so gibt er mir ja jede ausgaben nummer aus...

                    was muss ich nun mit dem min() machen? klingt irgendwie logisch, aber wenn er es in der select abfrage nicht annimmt?

                    1. Hello,

                      halt stop! nicht der richtige wert... so gibt er mir ja jede ausgaben nummer aus...

                      Dazu müssten wir erstmal die Spaltentypen Deiner Tabelle kennen und was in $time (dem Vergleichswert) drinteht.

                      Min() fiel mir nur gleich als erstes ein.

                      ein "limit 1" könnte für Dich viel interessanter werden, weil Du dann nicht nur den Termin sondern auch die Ausgabe und was Du sonst noch brauchst, bekommst. Sonst müsste man ein Subselect machen und das ist hier vollkommen unnötig (hoffe ich)

                      select number, closing_date
                         from issue
                         where unix_timestamp(closing_date) > $time
                         order by closing_date
                         limit 1;

                      Harzliche Grüße vom Berg
                      http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau

                      1. Dazu müssten wir erstmal die Spaltentypen Deiner Tabelle kennen und was in $time (dem Vergleichswert) drinteht.

                        klingt logisch,
                        schau mal hier:

                        http://forum.de.selfhtml.org/?t=150343&m=976998

      2. Hello,

        select min(az) from ausgaben where az > $abgabetermin;

        Hallo,

        danke für deine Hilfe. Ja es steht in einer MySQL Datenbank.

        number year closing_date date_of_publication
        05 2007 1175724000 1177970400
        06 2007 1179179999 1181512800
        07 2007 1181080799 1183240800

        $abfrage = "SELECT min(closing_date) FROM issue WHERE closing_date > $time";

        In welcher Form liegt $time vor?
        Welchen Spaltentyp hat closing_date?
        Führst Du das definierte Query auch durch? Wie?

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. In welcher Form liegt $time vor?

          in einem timestamp

          Welchen Spaltentyp hat closing_date?

          momentan noch 'varchar'

          Führst Du das definierte Query auch durch? Wie?

          mein query sieht so aus:

          $time=time();
           $abfrage = "SELECT closing_date,number FROM issue WHERE closing_date > $time";
           $ergebnis = mysql_query($abfrage);

          while($row = mysql_fetch_object($ergebnis)) {
             echo $row->number;
           }

          1. Hello,

            In welcher Form liegt $time vor?

            in einem timestamp

            Hatte ich vermutet

            Welchen Spaltentyp hat closing_date?

            momentan noch 'varchar'

            hatte ich befürchtet, aber eher angenommen, dass es "timestamp" wäre

            $time=time();
            $abfrage = "SELECT closing_date,number FROM issue WHERE closing_date > $time";

            echo "<p>Abfrage: ". htmlentities($abfrage,ENT_QUOTES)."</p>\n";

            $ergebnis = mysql_query($abfrage);

            while($row = mysql_fetch_object($ergebnis)) {
               echo $row->number;
            }

            Dass da nichts rauskommt, stellst Du am besten fest, wenn du die Zeile "echo $abfrage" mal einfügst.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. $time=time();
              $abfrage = "SELECT closing_date,number FROM issue WHERE closing_date > $time";

              echo "<p>Abfrage: ". htmlentities($abfrage,ENT_QUOTES)."</p>\n";

              $ergebnis = mysql_query($abfrage);

              while($row = mysql_fetch_object($ergebnis)) {
                 echo $row->number;
              }

              Dass da nichts rauskommt, stellst Du am besten fest, wenn du die Zeile "echo $abfrage" mal einfügst.

              Dann bekomme ich das:
              Abfrage: SELECT closing_date,number FROM issue WHERE closing_date > 1176390601

              060708

              letzteres sind die ausgaben die in spalte number drin stehen...

              1. Hello,

                Dann bekomme ich das:
                Abfrage: SELECT closing_date,number FROM issue WHERE closing_date > 1176390601

                060708

                Lass uns nochmal sortieren

                Du benutzt MySL.

                Deine Spalte "closing_date" hat noch den Typ varchar, ist das richtig?

                Welche Werte stehen da drin; so wie in https://forum.selfhtml.org/?t=150343&m=976953 beschrieben? Also zu strings gemachte UNIX-Timestamps (also in PHP mit time() erzeugt)?

                Wenn das so ist, benötigst Du bei der Abrage auch kein "unix_timstamp()", da ja ein Stringvergleich durchgeführt wird. Besser wäre es natürlich, Daten auch als solche in der DB zu speichern, z.B. als "datetime"-Typ. Dann muss man natürlich wieder die Umwandlungsfunktion von MySQL benutzen

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Lass uns nochmal sortieren

                  ok!

                  Du benutzt MySL.

                  Deine Spalte "closing_date" hat noch den Typ varchar, ist das richtig?

                  Ja, richtig!

                  Welche Werte stehen da drin; so wie in https://forum.selfhtml.org/?t=150343&m=976953 beschrieben? Also zu strings gemachte UNIX-Timestamps (also in PHP mit time() erzeugt)?

                  genau!

                  Wenn das so ist, benötigst Du bei der Abrage auch kein "unix_timstamp()", da ja ein Stringvergleich durchgeführt wird. Besser wäre es natürlich, Daten auch als solche in der DB zu speichern, z.B. als "datetime"-Typ. Dann muss man natürlich wieder die Umwandlungsfunktion von MySQL benutzen

                  das klingt logisch, aber weiter gekommen bin ich deswegen noch nicht ;-)

                  1. Hello,

                    das klingt logisch, aber weiter gekommen bin ich deswegen noch nicht ;-)

                    Bei mir funktioniert das erstklassig.

                    $abfrage = "
                       select number, closing_date
                       from issue
                       where closing_date > '$time'
                       order by closing_date
                       limit 1";

                    und dann späater mit

                    $_ergebnis = mysql_fetch_assoc($res);

                    Das besteht dann aus $_ergebnis['number'] und $_ergebnis['closing_time']

                    Du musst nun nur die Funktion Unix_Timestamp() wieder rausnehmen, da Du nur Strings vergeleichst

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau