Bene: PHP-Abfrage für die jeweiligen Wochenenden

Hi,

in der "MySQL-Szene" :-) bin ich relativer Neuling und habe eine Frage:
In meiner Abfrage - es ist ein sehr sehr einfacher "Kalender" (eine Terminabfrage), würde ich gerne alle eingetragenen Werte des jeweiligen Wochenendes anzeigen lassen. Meine Abfrage sieht bisher so aus:

$sql = "SELECT
id,
datum,
uhrzeit,
titel,
text
FROM
termine ORDER BY datum ASC";

Wie muss denn bitte die Abfrage aussehen, wenn ich NUR die Sachen angezeigt bekommen will, die an DIESEM Wochenende stattfinden (also praktisch WHERE datum = DIESES WOCHENENDE).

Die Termine werden automatisch aus der DB gelöscht mit...

mysql_query("DELETE from termine WHERE datum < now()") OR die(mysql_error());

Bleibt - wie gesagt - die Frage offen, wie ich nur die Wochenende angezeigt bekomme.

Mit bestem Dank und Gruß

  1. Moin!

    Wie muss denn bitte die Abfrage aussehen, wenn ich NUR die Sachen angezeigt bekommen will, die an DIESEM Wochenende stattfinden (also praktisch WHERE datum = DIESES WOCHENENDE).

    Ein guter Ansatz. Jetzt fehlt dir nur noch eine SQL-konforme Formulierung für "DIESES WOCHENENDE".

    Hast du schon mal in die MySQL-Doku geschaut. Da sind ganz viele Funktionen für die Arbeit mit Datum und Zeit aufgeführt - unter anderem auch welche, die feststellen, welcher Tag der Woche ein Datum ist.

    Wenn du weißt, welcher Tag heute ist, weißt du, in wievielen Tagen Samstag und Sonntag ist.

    Funktionen zur Addition von Daten gibts natürlich ebenfalls. :)

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin!

      Hast du schon mal in die MySQL-Doku geschaut. Da sind ganz viele Funktionen für die Arbeit mit Datum und Zeit aufgeführt - unter anderem auch welche, die feststellen, welcher Tag der Woche ein Datum ist.

      http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. ...Danke!

        Ehrlich gesagt steige ich (noch) nicht durch. Das ist ja ein Haufen Zeug...

        1. Hallo Bene,

          Ehrlich gesagt steige ich (noch) nicht durch. Das ist ja ein Haufen Zeug...

          wo ist das Problem? Was heißt "Tag der Woche" auf englisch? Wäre das mal einen Blick wert?

          Freundliche Grüße

          Vinzenz

          1. »

            wo ist das Problem? Was heißt "Tag der Woche" auf englisch? Wäre das mal einen Blick wert?

            Das sind genau die schlauen Sprüche die man dann braucht

            1. Hallo

              wo ist das Problem? Was heißt "Tag der Woche" auf englisch? Wäre das mal einen Blick wert?
              Das sind genau die schlauen Sprüche die man dann braucht

              wenn Du Dein Problem nicht besser beschreiben kann, wenn Du zu bequem bist, eine verlinkte Seite gezielt zu überfliegen, dann erscheint reale Hilfe als schlauer Spruch.

              Was heißt "Tag der Woche"?
              Und was findest Du dazu in der Liste der Funktionen?
              http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

              Und bitte erläutere uns, warum Dir das nicht weiterhilft.

              Freundliche Grüße

              Vinzenz

              1. Moin!

                Was heißt "Tag der Woche"?
                Und was findest Du dazu in der Liste der Funktionen?
                http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

                Diese Seite gibts auch auf Deutsch, da muß man dann gar nichts mehr übersetzen. Hatte ich ja verlinkt.

                Andererseits ist es immer eine gute Idee, sich der gesamten Möglichkeiten bewußt zu sein (also alle Funktionen mal zu lesen), damit man sich später dann vielleicht erinnert "da war doch was...", und nochmal genau nachliest, wie das denn konkret funktioniert.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Hallo Sven,

                  Was heißt "Tag der Woche"?
                  Und was findest Du dazu in der Liste der Funktionen?
                  http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

                  Diese Seite gibts auch auf Deutsch, da muß man dann gar nichts mehr übersetzen. Hatte ich ja verlinkt.

                  ich weiß - die englische Version hat unter anderem den Vorteil, dass sie mit
                  einer Liste der Funktionen beginnt, die vielleicht leichter zu überfliegen ist
                  als die Funktionen im Fließtext.

                  Andererseits ist es immer eine gute Idee, sich der gesamten Möglichkeiten bewußt zu sein (also alle Funktionen mal zu lesen), damit man sich später dann vielleicht erinnert "da war doch was...", und nochmal genau nachliest, wie das denn konkret funktioniert.

                  Das sowieso.

                  Freundliche Grüße

                  Vinzenz

                  1. Vielen Dank an alle Postings,

                    bin leider erst jetzt wieder am Rechner und komme erst am Freitag Abend dazu, es umzusetzen.

                    Wenn man die Postings von mir sieht, wird man auch sehen, dass dazwischen ein gewisser Zeitraum liegt. Ich habe mir das gründlich durchgelesen, mehrfach, versucht anzuwenden - es ist aber in der Tat so, dass ich auf keine Lösung gekommen bin.

                    Manchmal hat es nichts mit Faulheit oder Bequemlichkeit zu tun, wenn man am liebsten einen Codeschnippel hätte. Dann weiß man, wie das aussieht, und dann kann man darauf basierend andere Funktionen austesten.

                    Ich habe gegoogelt und "geforscht", leider aber nicht mehr erreicht bzw. mein Vorhaben vorhin nicht umsetzen können. Von "schlauem Spruch" habe ich dann gesprochen, weil man auf der Stelle tritt und ungeduldig wird, wenn man nach Stunden (noch immer) keine Lösung hat.

                    Den Vorwurf der Bequemlichkeit muss ich mir deshalb nicht anhören. Wenn Du (Vincent oder wie der Name war) meinst, mit einem Satz, diesen auch noch oberschlau dahin geworfen, helfen zu können, dann lass es in Zukunft bitte. Nicht Jedermann hat Deine Kompetenz und nicht Jedermann ist in der Lage, mit einem Satz und nem cleveren Übersetzungshinweis etwas anzufangen. Für Dein Ego war es dagegen sicherlich eine geile Erfahrung.

                    Besten Dank an die anderen Helfer!

                    1. Hallo Bene,

                      Für Dein Ego war es dagegen sicherlich eine geile Erfahrung.

                      Warum bringst Du jetzt plötzlich billige Polemik? Vor allem nach dem Rest des Postings, der ein viel (!) höheres Niveau zeigte?

                      Vinzenz mag zwar nicht in der Lage gewesen sein, Deine Verständnisprobleme nachzuvollziehen, aber ich hatte nun wirklich nicht den Eindruck, dass er wegen seines Egos hier gepostet. Und ich hatte auch nicht den Eindruck, dass er arrogant sein wollte, auch wenn das bei Dir offensichtlich so angekommen ist.

                      Und - sebst wenn das tatsächlich der Fall gewesen wäre - jemandem Arroganz und Egozentrizität zu unterstellen wird garantiert nicht dabei helfen, ihm Deine Sicht der Dinge nahe zu bringen.

                      Viele Grüße,
                      Christian

                    2. Damit kannst du das kommende Wochenende berechnen und die SQL einfach halten.

                      $wochentag=date('w',time());// 0 Sonntag .. 6 Sonnabend
                      switch ($wochentag) {
                      case 0: // Sonntag
                          $p1=-86400; // will Sonnabend mit haben
                          $p2=0;
                          break;
                      case 1: // Montag
                          $p1=86400*5;
                       $p2=86400*6;
                          break;
                      case 2://Dienstag
                          $p1=86400*4;
                       $p2=86400*5;

                      break;
                      case 3://Mittwoch
                          $p1=86400*3;
                       $p2=86400*4;

                      break;
                      case 4://Donnerstag
                          $p1=86400*2;
                       $p2=86400*3;

                      break;
                      case 5://Freitag
                          $p1=86400;
                       $p2=86400*2;

                      break;
                      case 6://Sonnabend
                          $p1=0;
                       $p2=86400;

                      }

                      echo date('j.n.Y',time()+$p1).'<br />';
                      echo date('j.n.Y',time()+$p2).'<br />';

                      Da ich nicht weiss in welchem Format du das Datum abgespeichert hast must du entsprechend umarbeiten:

                      time()+$p1 ergibt das Datum des kommenden Sonnabends und time()+p2 den Sonntag.

                      Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
                      Das kannst du mit date und mktime machen.

                      Die Abfrage sähe dann so aus where datum=wert1 or datum=wert2

                      Das Format wert1 und wert2 sind den DB Verhältnissen anzupassen.

                      1. Hallo,

                        Sorry, ich finde leider keine schonende Methode das zu sagen, daher sage ich's direkt: Der Code ist Müll. Er Code ist ineffizient (für jeden Wochentag einen eigenen case, wenn einfache Arithmetik ausreicht?) und fliegt zudem bei Sommer- und Winterzeitumstellungen potentiell auf die Schnauze. Zudem ist j.n.Y nicht unbedingt sinnvoll als Datumsformat, um es einer Datenbank zu übergeben - Y-m-d ist besser.

                        Wenn der Code also in PHP und nicht im SQL sein soll (entgegen meiner Lösung), dann würde folgender PHP-Code wesentlich besser geeignet sein:

                        $jetzt = time ();  
                        $wochentag = date ('w', $jetzt);  
                        $tage = (7 - $wochentag) % 7;  
                        // ende des wochenendes  
                        $montag = strtotime ('00:00:00 + '.($tage + 1).' days');  
                        // start des wochenendes  
                        $samstag = strtotime ('- 2 days', $montag);  
                          
                        // datum berechnen  
                        $startDatum = date ('Y-m-d', $samstag);  
                        $endDatum = date ('Y-m-d', $montag);  
                          
                        // SQL-select ausgeben  
                        $query = "SELECT ... WHERE datum >= '".mysql_real_escape_string ($startDatum)."' AND datum < '".mysql_real_escape_string ($endDatum)."'";
                        

                        Zur Erläuterung:

                        $jetzt = time ();

                        Aktuelles Datum holen und sich merken.

                        $wochentag = date ('w', $jetzt);

                        Den Wochentag des aktuellen Datums bestimmen. Hierbei ist 0 = Sonntag und 6 = Samstag.

                        $tage = (7 - $wochentag) % 7;

                        Die Anzahl an verbleibenden Tagen bis zum Sonntag (Ende des Wochenendes) berechnen - siehe meine andere Funktion.

                        $montag = strtotime ('00:00:00 + '.($tage + 1).' days', $jetzt);

                        Wir brauchen das Datum von Montag um Mitternacht. Hier wird explizit strtotime() genutzt und *NICHT* auf den Timestamp einfach 86400 addiert / subtraiert, weil nicht jeder Tag 86400 Sekunden hat (bei der Umstellung von Sommer- auf Winterzeit nämlich nicht!).

                        Zur genauen Erläuterung, was strtotime() hier macht:

                        strtotime('00:00:00', $jetzt) gibt den Timestamp um Mitternacht des Tages zurück, an dem sich $jetzt befindet (d.h. wenn $jetzt bereits Mitternacht wäre, würde es $jetzt zurückgeben).

                        Wenn man jetzt noch zusätzlich z.B. ' + 2 days' anängt, dann wird auf das aktuelle Datum 2 Tage addiert. Dies geschieht jedoch NICHT über Vielfache von 86400, sondern über richtige Kalenderberechnung - sprich: Sommer- und Winterzeitumstellungen werden korrekt berücksichtigt.

                        $samstag = strtotime ('- 2 days', $montag);

                        Hier wird nun der Start des Wochenendes gesucht.

                        $startDatum = date ('Y-m-d', $samstag);  
                        $endDatum = date ('Y-m-d', $montag);
                        

                        Hier werden die Daten jetzt so formatiert, das die Datenbank sie versteht.

                        $query = "SELECT ... WHERE datum >= '".mysql_real_escape_string ($startDatum)."' AND datum < '".mysql_real_escape_string ($endDatum)."'";

                        Und hier wird exemplarisch die Abfrage zusammengebaut.

                        Viele Grüße,
                        Christian

                        1. Der Code ist Müll

                          Hier geht es nicht um Effizienz sondern um den Versuch einen Weg verständlich  zu beschreiben, wenn man merkt das ein Fragesteller da eine Hilfe benötigt und etwas nachvollziehbares benötigt.

                          Die ganze Sache kann man auch als 3 Zeiler verfassen und das wäre lesbar  und wenn man will inkl. Mysql Abfrage sogar als Einzeiler (so würde ich das bei mir einsetzen - wenn es um Effizienz gehen würde und keineswegs eine ganze Arie von Anweisungen verwenden).

                          Also den PHP Coder herauszuhängen zu lassen wäre wohl falsch  am Platz und solche Kommentare »» Der Code ist Müll <== übrigens auch.
                          Hilfe ist da gegeben, wenn der Gegenüber das auch nachvollziehen kann und so muss man es darstellen - auch zu Lasten der Effizienz.

                          1. Hallo,

                            Der Code ist Müll

                            Hier geht es nicht um Effizienz

                            Gut, Effizienz war vielleicht der falsche Ausdruck. Was ich eigentlich meinte ist: EXTREM schlechter Stil.

                            Zudem: Den Punkt, dass Dein Code nicht korrekt funktioniert, unterschlägst Du ja in Deiner Antwort auch noch.

                            sondern um den Versuch einen Weg verständlich  zu beschreiben, wenn man merkt das ein Fragesteller da eine Hilfe benötigt und etwas nachvollziehbares benötigt.

                            Wenn etwas an meinen beiden Lösungen [1, 2] nicht verständlich oder nachvollziehbar war, dann kann man ja gerne nachfragen.

                            Also den PHP Coder herauszuhängen zu lassen wäre wohl falsch  am Platz

                            Was bitteschön ist an meinen Antworten an Bene "den PHP Coder heraushängen lassen"? Ich habe versucht, sinnvolle Lösungswege für das Problem verständlich darzustellen und habe für jeden Schritt ausführlich beschrieben, was dort geschieht.

                            und solche Kommentare »» Der Code ist Müll <== übrigens auch.

                            Als was würdest Du Deinen Code (objektiv gesehen) denn sonst bezeichnen? Wie gesagt: Ich meine es nicht böse, aber es fällt mir einfach kein anderes Wort ein als "Müll", wenn ich so einen Code sehe.

                            Hilfe ist da gegeben, wenn der Gegenüber das auch nachvollziehen kann und so muss man es darstellen - auch zu Lasten der Effizienz.

                            Dass der Gegenüber das nachvollziehen können soll, steht ja außer Frage. Aber Hilfe ist NICHT gegeben, wenn man jemandem derart schlechten Stil empfielt, dass die Person dann weitermacht, so Code zu schreiben - das hilft der Person nämlich langfristig GAR NICHT, das ist auf Dauer vollkommen kontraproduktiv. Und wenn dann der Code auch noch fehlerhaft ist (so wie Deiner - ich wiederhole das Stichwort Sommeer-/Winterzeit nochmal), dann zeigt sich mal wieder, dass "gut" das Gegenteil von "gut gemeint" ist...

                            Zudem Dein Code ja nichtmal vollständig war - Du hast nicht erklärt, auf welche Weise das dann ins SQL eingebaut werden sollte und das Problem der Urzeit handelst Du lapidar mit folgendem Absatz ab:

                            Aber du solltest vorher die Werte korrigieren, so das diese um 0.00
                            anfangen, also Uhrzeit weg.
                            Das kannst du mit date und mktime machen.

                            Das ist in meinen Augen absolut nicht hilfreich für's Verständnis.

                            Und genau aus diesen genannten Gründen schrieb ich "Müll" bei Deinem Code. Ist wie gesagt nicht persönlich gemeint, aber ein anderes Urteil kann man in meinen Augen leider nicht fällen.

                            Viele Grüße,
                            Christian

                            1. Na fehlerhafter Code (schmunzel)  - die effiziente (und umfassendere)  Form  wird in rund 12000 Fällen täglich eingesetzt únd zwar in Kalendermodulen  und für verschiedene CMS.

                              Und unter denjenigen Anwendern sitzen Code - Kaliber die jeden Murks sofort melden - das kannst du mir einfach glauben.

                              Ich empfehle immer gerne sich mit den entsprechenden Handbüchern auseinander zu setzen - da lerne auch ich immer etwas dazu.

                              Ich könnte dazu noch eine Menge sehr konkretes schreiben, aber es geht in diesem Posting um eine ganz andere Sache und damit sollten wir es bewenden lassen.

                              Jeder sollte seinen Hilfebeitrag leisten wie er kann und will , da sind natürlich immer unterschiedliche Wege möglich , denn viele Wege fphren nach Rom.
                              Sich dann noch über den Weg zu streiten ist für den Fragesteller einfach unschön.

                              1. Moin!

                                Na fehlerhafter Code (schmunzel)  - die effiziente (und umfassendere)  Form  wird in rund 12000 Fällen täglich eingesetzt únd zwar in Kalendermodulen  und für verschiedene CMS.

                                Und unter denjenigen Anwendern sitzen Code - Kaliber die jeden Murks sofort melden - das kannst du mir einfach glauben.

                                Ja und? Jetzt hat Christian - ebenfalls als Code-Kaliber - deinen Murks hier im Forum gemeldet, und du fühlst dich merkwürdigerweise gleich persönlich angegriffen.

                                Ich könnte dazu noch eine Menge sehr konkretes schreiben, aber es geht in diesem Posting um eine ganz andere Sache und damit sollten wir es bewenden lassen.

                                Es geht darum, dass du in deiner Lösung von der falschen Tatsache ausgehst, ein Tage bestünde immer aus 24 Stunden. Das ist der wichtigste Kritikpunkt an deinem Code - und darauf bist du bislang nicht eingegangen.

                                Jeder sollte seinen Hilfebeitrag leisten wie er kann und will , da sind natürlich immer unterschiedliche Wege möglich , denn viele Wege fphren nach Rom.
                                Sich dann noch über den Weg zu streiten ist für den Fragesteller einfach unschön.

                                Im Gegenteil: Sachliche Argumente pro oder contra einer konkreten Lösung führen durchaus zu weitergehenden Erkenntnissen. Nur kam bislang von dir nicht mehr soviel sachliches, stattdessen nur Abwiegeln.

                                - Sven Rautenberg

                                --
                                "Love your nation - respect the others."
                                1. ==>Es geht darum, dass du in deiner Lösung von der falschen Tatsache ausgehst, ein Tage bestünde immer aus 24 Stunden

                                  Lesen ist immer gut:

                                  ==>Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
                                  Das kannst du mit date und mktime machen.

                                  Es geht nur um die Feststellung ob wir Sonnabend und Sonntag haben und nicht um die Uhrzeit - die Uhrzeit ist überhaupt nicht relevant.

                                  Server stellen sich übrigens auch auf Sommer - und Winterzeit um.

                                  Davon abgesehen, Sommer und Winterzeit spielen für den Einsatz keine Rolle.

                                  Ich  lande immer auf den korrekten Tag.

                                  Nehmen wir mal an wir hätten heute Umstellung auf die Sommerzeit, das würde bedeuten um 2 Uhr wird die Uhr auf 2 vorgestellt.
                                  Das machen aber auch die Server.
                                  Aber egal ob ich nun um 2 Uhr oder um 3 einen Tag dazu rechne (egal ob Tag = Tag +1 oder Tag + 86400), das Vergleichsdatum bleibt immer der 18.11., da Uhrzeitanteile nicht gefragt sind.

                                  Nun - alles klar.

                                  1. Muss natürlich heissen auf 3 vorgestellt.

                                  2. Hallo,

                                    Ich  lande immer auf den korrekten Tag.

                                    Nein, tust Du nicht. Wenn ich Dein Script, in der Form wie DU es gepostet hast, am 24. März 2008 um 23:30 aufrufe, dann spuckt er mir aus:

                                    29.3.2008<br />
                                    31.3.2008<br />

                                    Korrekt wäre:

                                    29.3.2008<br />
                                    30.3.2008<br />

                                    Das einzige, was ich an Deinem Script geändert habe, ist time() durch $zeit ersetzt.

                                    <?php  
                                      
                                    // $zeit = time ();  
                                    $zeit = 1206397800;  
                                      
                                    $wochentag=date('w', $zeit);// 0 Sonntag .. 6 Sonnabend  
                                    switch ($wochentag) {  
                                    case 0: // Sonntag  
                                        $p1=-86400; // will Sonnabend mit haben  
                                        $p2=0;  
                                        break;  
                                    case 1: // Montag  
                                        $p1=86400*5;  
                                     $p2=86400*6;  
                                        break;  
                                    case 2://Dienstag  
                                        $p1=86400*4;  
                                     $p2=86400*5;  
                                      
                                        break;  
                                    case 3://Mittwoch  
                                        $p1=86400*3;  
                                     $p2=86400*4;  
                                      
                                        break;  
                                    case 4://Donnerstag  
                                        $p1=86400*2;  
                                     $p2=86400*3;  
                                      
                                        break;  
                                    case 5://Freitag  
                                        $p1=86400;  
                                     $p2=86400*2;  
                                      
                                        break;  
                                    case 6://Sonnabend  
                                        $p1=0;  
                                     $p2=86400;  
                                      
                                      
                                    }  
                                      
                                    echo date('j.n.Y',$zeit+$p1).'<br />';  
                                    echo date('j.n.Y',$zeit+$p2).'<br />';  
                                      
                                    ?>
                                    

                                    Ferner: Selbst *wenn* Du die Uhrzeit auf 00:00:00 beschränkst (was Du in Deinem Vorschlag aber nur dahingesagt hast, nichtmal ansatzweise erläutert hast! Und ich habe mich auf den von Dir vorgestellten Code bezogen), funktioniert Dein Code nur ZUFÄLLIGERWEISE, weil die Zeitumstellung hierzulande immer an einem Sonntag stattfindet und bei Dir gerade Sonntag die Grenze ist, schreibe den gleichen Code mal mit Montag statt Sonntag und der fliegt auch bei 00:00:00 auf die Schnauze. Oder geh nach Israel, wo die Zeitumstellung in eine Richtung an Freitagen stattfindet, da fliegt der Code genauso auf die Schnauze. Es ist ein grundsätzliches, von Dir unverstandenes Problem im Code vorhanden ist, nämlich, dass Timestamps eine kontinuierliche Zeitskala darstellen, unsere Lokalzeit jedoch nicht (!). Lies Dir zu dem Thema bitte ein Archivposting von mir durch: http://forum.de.selfhtml.org/archiv/2007/10/t159879/#m1039891.

                                    Viele Grüße,
                                    Christian

                                    1. Ich kann mich nur wiederholen

                                      ==> Lesen ist immer gut:

                                      ==>Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
                                      Das kannst du mit date und mktime machen.

                                      Warum muss man sich hier ständig wiederholen ?

                                      Nun mal ganze etwas gekürzt, ein wenig kompakter und für jedermann der damit ein Problem hat;

                                      // Das ist die Routine für den Einsatz
                                      $heute = mktime(0, 0, 0, date('m'),date('j'),date('Y'));
                                      $t1=array(-86400,432000,345600,259200,172800,86400,0);
                                      $t2=array(0,518400,432000,345600,259200,172800,86400);
                                      $wochentag=date('w',$heute);// 0 Sonntag .. 6 Sonnabend
                                      $p1=$t1[$wochentag]+$heute;
                                      $p2=$t2[$wochentag]+$heute;
                                      $sql="SELECT id,datum,uhrzeit,titel,text FROM termine WHERE datum=$p1 OR datum=$p2 ORDER BY datum,uhrzeit ASC";
                                      /*
                                      Die sql gilt nur wenn datum als int abgelegt ist, ansonsten müssen $p1 und $p2 entsprechend behandelt werden.
                                      Die Sortierung wurde auf datum,uhrzeit erweitert.
                                      */

                                      echo date('j.m.Y',$p1).'<br />';
                                      echo date('j.m.Y',$p2).'<br />';

                                      // hier nun mal der Gegentest
                                      echo '<hr />';
                                      $datum=1195321110+28000; // entspricht 18.11.2007 02:11
                                      echo date('j.m.Y H:m',$datum).'  Das ist das Datum um die Routine anschmieren zu wollen<br />';
                                      $heute = mktime(0, 0, 0, date('m',$datum),date('j',$datum),date('Y',$datum));
                                      $t1=array(-86400,432000,345600,259200,172800,86400,0);
                                      $t2=array(0,518400,432000,345600,259200,172800,86400);
                                      $wochentag=date('w',$heute);// 0 Sonntag .. 6 Sonnabend
                                      $p1=$t1[$wochentag]+$heute;
                                      $p2=$t2[$wochentag]+$heute;
                                      echo date('j.m.Y',$p1).'<br />';
                                      echo date('j.m.Y',$p2).'<br />';

                                      Und das ist das Ergebnis

                                      17.11.2007
                                      18.11.2007
                                      18.11.2007 02:11 Das ist das Datum um die Routine anschmieren zu wollen
                                      17.11.2007
                                      18.11.2007

                                      Der 17.11 und der 18.11 ist bekannterweise dieses Wochenende und genau das ist es was wir haben wollen.

                                      1. Wer will kann das auch mal mit dem Wert vom 25.3.2007 testen, das ist das Datum der Umstellung auf Sommerzeit.

                                        Timestamp ist da 1174777200  für 0:00

                                        Das Ergebnis ist auch zwischen 2:00 und 3:00 immer korrekt, was beweist, das Uhrzeiten keine Geige spielen.

                                      2. Hallo,

                                        Ich kann mich nur wiederholen
                                        [...]

                                        Ja, das habe ich gelesen und darauf bin ich auch eingegangen. Lies Dir doch bitte ENDLICH mal durch, was ICH schrieb.

                                        Nochmal: Du postest Code, der nachweislich fehlerhaft ist (siehe mein voriges Posting). Dann schreibst Du noch folgenden NEBENSATZ dazu:

                                        ==>Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
                                        Das kannst du mit date und mktime machen.

                                        Ja. Toll. Erstens ist das GAR NICHT in Deinem Code enthalten, zweitens wird nicht erwähnt, WARUM das gebraucht wird. Wenn jemand also Dein Posting liest, wird er evtl. nur den Code nehmen und da er SCHEINBAR funktioniert, wird er den Code übernehmen, OHNE Deinen Nebensatz zu beachten - weil Du ihn NICHT explizit davor warnst, dass es OHNE diese Sache zu Problemen kommen kann.

                                        ZUDEM hast Du noch das Problem, dass Dein Code nur hier in EUROPA ZUFÄLLIGERWEISE funktioniert, weil bei Dir gerade SONNTAG die Grenze ist und SONNTAG auch die Zeitumstellung ist!

                                        Gehen wir mal nach Chowd ins Jahr 2004. Das liegt in der Mongolei. Dort wurde am Samtsag (und nicht - wie bei uns - am Sonntag!), den 25. September 2004 die Zeit von Sommer- auf Winterzeit umgestellt.

                                        Beachte, dass PHPs Datums- und Zeitfunktionen per Default die Länder- und Zeiteinstellungen des Servers beachten, man sie aber ab PHP 5.2 (oder 5.1?) auch selbst beeinflussen kann.

                                        Im folgenden habe ich an Deinen Code lediglich ein date_default_timezone_set() hinzugefügt (wie gesagt: ab PHP 5.2), damit er eine andere Zeitzone zur Berechnung nutzt. Ansonsten ist Dein Code identisch:

                                        <?php  
                                          
                                        date_default_timezone_set ('Asia/Hovd');  
                                          
                                        // hier nun mal der Gegentest  
                                        echo '<hr />';  
                                        $datum = 1096041600;  
                                        echo date('j.m.Y H:i:s',$datum)."  Das ist das Datum um die Routine anschmieren zu wollen<br />\n";  
                                        $heute = mktime(0, 0, 0, date('m',$datum),date('j',$datum),date('Y',$datum));  
                                        $t1=array(-86400,432000,345600,259200,172800,86400,0);  
                                        $t2=array(0,518400,432000,345600,259200,172800,86400);  
                                        $wochentag=date('w',$heute);// 0 Sonntag .. 6 Sonnabend  
                                        $p1=$t1[$wochentag]+$heute;  
                                        $p2=$t2[$wochentag]+$heute;  
                                        echo date('j.m.Y',$p1)."<br />\n";  
                                        echo date('j.m.Y',$p2)."<br />\n";  
                                          
                                        ?>
                                        

                                        Und was passiert als Ausgabe?

                                        25.09.2004 00:00:00  Das ist das Datum um die Routine anschmieren zu wollen
                                        25.09.2004
                                        25.09.2004

                                        Oh, 2x das gleiche Datum? Sowas aber auch...

                                        Um mich jetzt NOCHMAL zu WIEDERHOLEN: Es ist reiner ZUFALL, dass die Routine von Dir HIER IN EUROPA funktioniert. Zum einen funktioniert sie WOANDERS nicht (siehe meine obige Demonstration), zum ANDEREN wird Deine Routine für JEDEN ANDEREN Wochentag als Sonntag GEHÖRIG auf die Schnauze fliegen. Wenn Du mit der gleichen Methode also zum Beispiel die Zeitspanne der nächsten ARBEITSWOCHE berechnen willst, dann hast Du hier in Deutschland das gleiche Problem, wie mit Deiner anderen Methode in der Mongolei (und noch an anderen Orten, es gibt noch eine Menge mehr Länder, die nicht Sonntags umstellen [1]).

                                        Also: Lies Dir nochmal mein Archivposting durch und erkenne, warum 86400 Sekunden zu addieren eine VERDAMMT SCHLECHTE IDEE ist, wenn man Datumsberechnungen anstellen will (zumindest wenn man Lokalzeit benutzt). Dass Du bisher Glück gehabt hast, ändert nichts an den grundsätzlichen Denkfehlern, die Du begehst.

                                        Viele Grüße,
                                        Christian

                                        [1] Gut, Mongolei stellt inzwischen gar nicht mehr um, war
                                        halt das erste Beispiel, das ich gefunden habe.

                                        1. Hallo,

                                          [1] Gut, Mongolei stellt inzwischen gar nicht mehr um, war halt das erste Beispiel, das ich gefunden habe.

                                          Oder, als etwas besseres Beispiel, weil noch aktueller: http://de.wikipedia.org/wiki/Amman@Amman (Hauptstadt von Jordanien), die stellen immer Freitags um (seit 2006 immer letzter Freitag im Oktober und letzter Freitag im März):

                                          date_default_timezone_set ('Asia/Amman');  
                                          $datum = 1193173200;
                                          

                                          Spuckt aus:

                                          24.10.2007 00:00:00  Das ist das Datum um die Routine anschmieren zu wollen
                                          26.10.2007
                                          27.10.2007

                                          Korrekt wäre:

                                          27.10.2007
                                          28.10.2007

                                          Viele Grüße,
                                          Christian

                                  3. Moin!

                                    ==>Es geht darum, dass du in deiner Lösung von der falschen Tatsache ausgehst, ein Tage bestünde immer aus 24 Stunden

                                    Lesen ist immer gut:

                                    ==>Aber du solltest vorher die Werte korrigieren, so das diese um 0.00 anfangen , also Uhrzeit weg.
                                    Das kannst du mit date und mktime machen.

                                    Gut, wir halten fest: Dein in https://forum.selfhtml.org/?t=161949&m=1053942 geposteter Code ohne Beachtung der Anmerkungen ist fehlerhaft, weil er zu inkorrekten Ergebnissen führt. Man sollte ihn so nicht verwenden.

                                    Es geht nur um die Feststellung ob wir Sonnabend und Sonntag haben und nicht um die Uhrzeit - die Uhrzeit ist überhaupt nicht relevant.

                                    Wenn man also den Aufruf von time() so korrigiert, dass nicht die aktuelle Uhrzeit verwendet wird, sondern derselbe Tag, aber 0:00 Uhr Mitternacht in die Berechnung eingeht, dann liefert dein Code nur unter der Voraussetzung korrekte Ergebnisse, dass tatsächlich in der jeweiligen Zeitzone die Sommerzeitumstellung nur am Sonntag irgendwann nach Mitternacht stattfindet, weil du mit deinen Berechnungen diese Grenze niemals überschreitest.

                                    Dennoch ist zu kritisieren, dass du in deiner Überlegung von der falschen Annahme ausgehst, ein Tag hat in 100% aller Fälle exakt 86400 Sekunden. Würde man deine Lösung adaptieren, aber die Aufgabenstellung leicht abwandeln, indem man sagt: "Ich will nicht das kommende Wochenende, sondern das vergangene Wochenende ermitteln", würde man genau die Grenze der Zeitumstellung in Deutschland kreuzen und damit zu falschen Ergebnissen gelangen.

                                    Von der Möglichkeit einer zeitlich anders platzierten Zeitumstellung in anderen Zeitzonen mal ganz abgesehen - Christian hat das ja schon ausführlich begründet.

                                    Server stellen sich übrigens auch auf Sommer - und Winterzeit um.

                                    Das stimmt - so halb. Server ändern die Zeitzone, auf der alle Ausgaben der lokalen Zeit basieren. Sie ändern aber NICHT den Unix-Timestamp. Der basiert einzig und allein auf der Anzahl vergangener Sekunden seit dem 1.1.1970 00:00 Uhr UTC.

                                    Davon abgesehen, Sommer und Winterzeit spielen für den Einsatz keine Rolle.

                                    Aber sicher doch. Dein Code enthält:
                                    $wochentag=date('w',time());// 0 Sonntag .. 6 Sonnabend

                                    time() liefert den auf der Zeitzone UTC basierenden Unix-Zeitstempel. date() berechnet aufgrund dieser Angabe und der Berücksichtigung der lokalen Zeitzone, die für den Server konfiguriert ist, das Tagesdatum und deshalb natürlich auch den Wochentag. Die lokale Zeitzone aber ändert sich, wenn zwischen Sommer- und Winterzeit gewechselt wird, was dafür sorgt, dass ein Tag eben auch mal nur 23 oder 25 Stunden lang ist.

                                    Ich lande immer auf den korrekten Tag.

                                    Weil du blind davon ausgehst, dass ein Tag 24 Stunden hat - und weil du zufälligerweise aufgrund der konkreten Ausarbeitung der Aufgabenstellung nicht in die Falle tappst.

                                    Wäre gefordert worden, den Unix-Zeitstempel von Samstag 00:00:00 Uhr und Sonntag 23:59:59 Uhr auszugeben, wärst du zu 100% in diese Falle getappt. Dann gibt es nämlich keine Konstruktionsmöglichkeit mehr, die Sommerzeitumstellung durch glückliche Umstände elegant zu umschiffen.

                                    Nehmen wir mal an wir hätten heute Umstellung auf die Sommerzeit, das würde bedeuten um 2 Uhr wird die Uhr auf 2 vorgestellt.
                                    Das machen aber auch die Server.

                                    Nein. Die Server stellen die Zeitzone um, der Unix-Timestamp erhöht sich pro Sekunde immer um exakt eine Sekunde.

                                    Die Umstellung der Zeitzone hat zur Folge, dass die errechnete Lokalzeit um eine Stunde springt.

                                    Aber egal ob ich nun um 2 Uhr oder um 3 einen Tag dazu rechne (egal ob Tag = Tag +1 oder Tag + 86400), das Vergleichsdatum bleibt immer der 18.11., da Uhrzeitanteile nicht gefragt sind.

                                    Wenn du am Tag der Umstellung von Sommerzeit auf Winterzeit nachts zwischen 00:00 und 00:59 diese Rechnung durchführst, wirst du bei der Datumsanzeige wieder nur auf Sonntag landen. Der Sonntag ist 25 Stunden lang (wenn man nur Datum und Uhrzeit, aber wie üblich nicht die Zeitzone notiert), d.h. zum Beispiel 00:30 Uhr plus 24 Stunden landet bei 24:30 Uhr - aber erst um 25:00 Uhr ist der nächste Tag erreicht.

                                    Du hast also für eine Stunde im Jahr das falsche Ergebnis. Korrekt hingegen ist, wenn man nur mit dem Tagesdatum rechnen will, auch nur "ein Tag" auf das Tagesdatum zu addieren, und die Zeitzonenfrage dadurch auszuklammern - nicht mit 86400 Sekunden in genau diese Falle zu tappen.

                                    Nun - alles klar.

                                    Mir schon lange - dir auch?

                                    - Sven Rautenberg

                                    --
                                    "Love your nation - respect the others."
              2. Hallo Vinzenz,

                wo ist das Problem? Was heißt "Tag der Woche" auf englisch? Wäre das mal einen Blick wert?
                Das sind genau die schlauen Sprüche die man dann braucht

                wenn Du Dein Problem nicht besser beschreiben kann, wenn Du zu bequem bist, eine verlinkte Seite gezielt zu überfliegen, dann erscheint reale Hilfe als schlauer Spruch.

                Ohne Dir zu nahe treten zu wollen, Du meinst es sicher gut: Wenn man sich nie mit Datums- und Zeitberechnung auseinandergesetzt hat, dann tut man sich damit konzeptionell sehr schwer. Insofern hilft für diese Aufgabenstellung die Funktionsliste alleine nicht viel, da es keine fertige Funktion gibt, die das bewerkstelligt, sondern man sich das mit etwas Logik selbst zusammenschustern muss - und damit haben viele eben erst einmal Probleme.

                Viele Grüße,
                Christian

  2. Hallo Bene,

    Ah, Datumsberechnung, mein Lieblingsthema. ;-)

    Wie muss denn bitte die Abfrage aussehen, wenn ich NUR die Sachen angezeigt bekommen will, die an DIESEM Wochenende stattfinden (also praktisch WHERE datum = DIESES WOCHENENDE).

    Ok, dann musst Du Dir zuerst überlegen, wie ist "dieses Wochenene" definiert? Ich gehe mal von folgender Definition aus (wenn Du das anders definierst, musst Du den Code natürlich entsprechend abwandeln):

    1. Das Wochenende besteht aus Samstag und Sonntag.
    2. Wenn Montag ist, dann ist das Wochenende in 6 Tagen gemeint, wenn Sonntag ist, dann befindet man sich gerade noch in dem Wochenende (d.h. keine Differenz).

    Dann solltest Du wissen, dass es am einfachsten zu rechnen ist, wenn Du erst einmal das Ende des Wochenendes bestimmst, das Du betrachten willst, also den Sonntag, der auf den aktuellen Wochentag folgt.

    Zuerst einmal: Den aktuellen Tag bekommst Du über die MySQL-Funktion CURDATE() heraus. SELECT CURDATE(); liefert Dir z.B. das aktuelle Datum.

    Jetzt stellt sich die Frage: Wie finde ich den nächsten Sonntag?

    a) Es gibt keine Funktion, die das direkt tut (zumindest kenne ich keine).
     b) Es lässt sich jedoch sehr einfach nachbauen.

    Es gibt nämlich die Funktion DAYOFWEEK(), die den Wochentag zu einem Datum ausspuckt: 1 für Sonntag, 2 für Montag, ..., 6 für Samstag. Mit dieser Funktion lässt sich ganz einfach berechnen, wie viele Tage es noch bis zum _NÄCHSTEN_ Sonntag sind. Denn der nächste Sonntag wäre, wenn die Skala nicht immer wieder bei 1 anfangen würde, bei der Zahl 8. Wenn Du also 8 - DAYOFWEEK(CURDATE()) rechnest, erhälst Du die Anzahl an Tage bis zum NÄCHSTEN Sonntag.

    Jetzt stellt sich das Problem, das ja - sollte der aktuelle Tag ein Sonntag sein - der Tag noch dazuzählen soll. Das bekommt man ganz einfach in den Griff: Per Modulo-Algebra. Wenn Du die Zahl einfach Modulo 7 (Anzahl Wochentage) rechnest, dann bekommst Du immer ein Ergebnis zwischen 0 (heute ist Sonntag) bis 6 (heute ist Montag, d.h. in 6 Tagen ist sonntag).

    Folgende Tabelle veranschaulicht das ganze:

    Tag            | DAYOFWEEK() | 8 - DAYOFWEEK() | (8 - DAYOFWEEK()) % 7
    ---------------+-------------+-----------------+------------------------
    Montag         | 2           | 6               | 6
    Dienstag       | 3           | 5               | 5
    Mittwoch       | 4           | 4               | 4
    Donnerstag     | 5           | 3               | 3
    Freitag        | 6           | 2               | 2
    Samstag        | 7           | 1               | 1
    Sonntag        | 1           | 7               | 0

    Jetzt weißt Du also, wie viele Tage es noch bis zum ENDE des Wochenendes sind. Jetzt möchtest Du aber das DATUM herausbekommen. Dafür bietet MySQL die Funktion DATE_ADD() an, die auf ein beliebiges Datum ein Intervall addieren kann. Wenn Du also das Datum des Sonntags herausbekommen willst, dann nimmst Du:

    DATE_ADD(CURDATE(), INTERVAL (8 - DAYOFWEEK(CURDATE())) % 7 DAY)

    Jetzt möchtest Du aber das Zeitfenster auf das Wochenende eingrenzen. Es fängt mit Samstag an und hört mit Sonntag auf.

    Da Datumsfelder im Allgemeinen auch Zeit beinhalten (DATE nicht, aber z.B. DATETIME schon) willst Du nicht mit Zeitresten hantieren wollen (ein DATE wird in DATETIME umgewandelt, indem die Uhrzeit auf 00:00:00 gesetzt wird, d.h. Sonntag wird zu Sonntag 00:00:00, was dann als Bedingung relativ unbrauchbar wird). Daher willst Du nun alle Daten AB Samstag VOR Montag haben. Samstag bekommst Du, indem Du 1 Tag abziehst, Montag, indem Du 1 Tag addierst.

    Ab Samstag:

    datum >= DATE_ADD(CURDATE(), INTERVAL (8 - DAYOFWEEK(CURDATE())) % 7 - 1 DAY)

    Vor Montag:

    datum < DATE_ADD(CURDATE(), INTERVAL (8 - DAYOFWEEK(CURDATE())) % 7 + 1 DAY)

    Zusammen:

    SELECT  
      id,  
      datum,  
      uhrzeit,  
      titel,  
      text  
    FROM  
      termine  
    WHERE  
      datum >= DATE_ADD(CURDATE(), INTERVAL (8 - DAYOFWEEK(CURDATE())) % 7 - 1 DAY)  
    AND  
      datum < DATE_ADD(CURDATE(), INTERVAL (8 - DAYOFWEEK(CURDATE())) % 7 + 1 DAY)  
    ORDER BY  
      datum ASC;
    

    Wenn das Wochenende bei Dir schon am Freitag anfängt, müsstest Du halt in der ersten Bedingung 2 Tage statt 1 Tag abziehen, oder eben:

    Die Termine werden automatisch aus der DB gelöscht mit...

    mysql_query("DELETE from termine WHERE datum < now()") OR die(mysql_error());

    In dem Fall reicht Dir eine Anfrage "bis zu diesem Wochenende" aus, d.h. Du kannst den datum >= ... Teil weglassen. Dann ist es auch relativ egal, wann das Wochenende startet, denn alle Termine vor *jetzt* sind sowieso gelöscht.

    Viele Grüße,
    Christian