timestamp - quartalsabfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • timestamp - quartalsabfrage

    hallo,

    ich habe nun 2 stunden das forum durchforstet, finde aber keinen weg.
    problem:
    datensätze in db mit timestamp.

    ich möchte alle datensätze des 1., 2., 3. und 4. quartals finden.

    hat jemand einen lösungsvorschlag?

    danke schon mal, gruss, wolfgang

  • #2
    dateformat ginge easy, aber timestamp? Warum wählt man überhaupt timestamp als Feldformat? Oder warum hast Du timestamp gewählt? Welchen Vorteil hast Du wenn Du all die Nachteile in Kauf nimmst?

    Kommentar


    • #3
      @hand,

      danke für die antwort.
      warum das format?

      ich habe versucht, mich als anfänger an empfehlungen zu halten, in diesem fall "php Referenz" von Jens Ferner.

      Zitat: "Um unnötig komplizierte Umrechnungen von vorformatierten Datumsformaten zu vermeiden, sollten Sie die meisten Ihrer Berechnungen auf dem UNIX-Timestamp aufbauen."

      macht im grunde für mich sinn, nur bei einer quartals-query wird es irgendwie kompliziert.

      gruss, wolfgang

      Kommentar


      • #4
        hallo breww,

        ich würds ja eher über "date" versuchen


        $monat = date("m");

        für den Datumswert

        in der db statt timestamp auch date verwenden

        und dann mit einer sql-abfrage

        ... where date(month) >< ...


        sorry, hab grad mein mysql-buch verlegt, aber darüber sollte es laufen.
        Kissolino.com

        Kommentar


        • #5
          Mein Tipp: "Um unnötig komplizierte Umrechnungen von vorformatierten Datumsformaten zu vermeiden, sollten Sie das der Abfragesprache ihres DBMS überlassen."

          Für die folgenden Beispiele muss `datum` ein Datumsfeld sein - DATE, DATETIME oder (mysql-)TIMESTAMP. Mit einer Unix-Timestamp klappt es nicht, egal ob im timestamp- oder int-Feld gespeichert.

          http://www.mysql.de/documentation/my...time_functions

          alle Datensätze mit zusätzlicher Spalte "quartal":
          "select *, quarter(datum) as quartal from tabelle"

          alle Datensätze im $n-ten Quartal:
          "select * from tabelle where quarter(datum)=$n


          noch eine tolle Funktion:
          date_format(datum, '%d.%m.%Y')
          mein Sport: mein Frühstück: meine Arbeit:

          Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

          Kommentar


          • #6
            und noch was: TIMESTAMP-Felder sollten auf keinen Fall als Datumsfelder missbraucht werden. Sie werden vom DBMS bei INSERT- und UPDATE-Operationen nämlich automatisch aktualisiert - allerdings (zumindest bei MySQL) nur das jeweils erste Timestamp-Feld des ersten geänderten Datensatzes.

            Beispiele:
            create table tabelle ( id INT auto_increment NOT NULL, stamp1 TIMESTAMP NOT NULL, stamp2 TIMESTAMP, string TEXT NULL, PRIMARY KEY ID );

            insert into tabelle (string) values('1'); (um 9:51)
            insert into tabelle (string, stamp2) values('2', now()); (um 9:52)
            1 | 20021204095100 | NULL | '1'
            2 | 20021204095200 | 20021204095200 | '2'
            stamp1 wird jeweils automatisch gesetzt.

            update tabelle set string='2a' where ID=2 (9:53)
            1 | 20021204095100 | NULL | '1'
            2 | 20021204095300 | 20021204095200 | '2'
            stamp1 wird automatisch aktualisiert.

            update tabelle set string='x' (9:54)
            1 | 20021204095400 | NULL | 'x'
            2 | 20021204095300 | 20021204095200 | 'x'
            stamp1 wird nur beim ersten Datensatz geändert(!)
            mein Sport: mein Frühstück: meine Arbeit:

            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

            Kommentar


            • #7
              ich würde auch wurzels vorschlag nehmen, einfach das datum mit
              $monat = date("m", $zeit);
              formatieren, wobei $zeit ein unix-timestamp ist.
              und dann für die quartale auf monat ziwschen 1 und 3, 4 und 6, etc. abfragen.


              andere möglichkeit:

              du bastelst dir erstmal selber zwei timestamps, die dein quartal abgrenzen, und vergleichst dann, ob dein timestamp dazwischen liegt, mit mktime():

              mktime(stunden, minuten, sekunden, monat, tag, jahr);

              beginn erstes quartal 2002:
              $quartalsanfang = mktime(0,0,0,1,1,2002);

              ende erstes quartal 2002:
              $quartalsende = mktime(0,0,0,4,1,2002);
              (nicht wirklich quartalsende, sondern sekundengenau anfang des nächsten, deshalb hier mit 'echt kleiner' abfragen)

              if ($zeit >= $quartalsanfang && $zeit < $quartalsende) { ... }
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Original geschrieben von Titus
                und noch was: TIMESTAMP-Felder sollten auf keinen Fall als Datumsfelder missbraucht werden. Sie werden vom DBMS bei INSERT- und UPDATE-Operationen nämlich automatisch aktualisiert - allerdings (zumindest bei MySQL) nur das jeweils erste Timestamp-Feld des ersten geänderten Datensatzes.
                was du hier meinst, ist ein mysql-feld, das wirklich mit dem datentyp TIMESTAMP definiert ist.

                wenn ich datümer in eine db schreibe, nehme ich als datentyp immer integer, in den ich dann einen unix-timestamp reinschreibe.

                das sind zwei verschiedene sachen; ich weiss nur nicht genau, welche davon der fragesteller jetzt genau gemeint hat...
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  hallo zusammen,

                  ich bin immer wieder verblüfft über die hilfsbereitschaft hier im forum, vielen dank an alle!

                  @wahsaga, ich habe tatsächlich ein mysql-feld, das mit dem datentyp TIMESTAMP definiert ist, gemeint.

                  wie oben schon gesagt, habe ich das in meiner "beginner"-naivität für den besten weg gehalten.

                  auch, weil man anhand der timestamps sortieren kann.
                  allerdings kann ich genausogut an hand der id sortieren.

                  ich denke, ich werde den weg, den wurzel u.a. gezeigt haben, nehmen.

                  noch einmal zum verständniss:
                  ein mysql-feld als TIMESTAMP zu definieren macht also nur sinn, wenn in dieses feld bei updates automatisch der aktuelle timestamp geschrieben werden soll? ansonsten datentyp integer, richtig?

                  vielen dank noch einmal für die tips,

                  gruss, wolfgang

                  Kommentar


                  • #10
                    soweit ich weiss wird das TIMESTAMP Feld nur dann automatisch gesetzt bzw. bei jeder Datensatzänderung aktualisiert wenn Du nicht selber was reinschreibst.
                    Grüße an alle und weiterhin frohes Arbeiten

                    Kommentar


                    • #11
                      @ eSHa,

                      handbuch:
                      "Der TIMESTAMP-Typ ist ein Typ, den Sie dafür benutzen können, um INSERT- oder UPDATE-Operationen mit dem aktuellen Datum und der aktuellen Zeit zu stempeln. Wenn Sie mehrfache TIMESTAMP-Spalten haben, wird nur die erste automatisch aktualisiert.

                      Die automatische Aktualisierung der TIMESTAMP-Spalte geschieht unter einer der folgenden Bedingungen:

                      Die Spalte wird in einem INSERT- oder LOAD DATA INFILE-Statement nicht explizit angegeben.
                      Die Spalte wird in einem UPDATE-Statement nicht explizit angegeben, aber ein anderer Spaltenwert ändert sich. (Beachten Sie, dass ein UPDATE, das eine Spalte auf einen Wert setzt, den diese bereits hat, nicht dazu führt, dass die TIMESTAMP-Spalte aktualisiert wird, weil MySQL das Aktualisieren in einem solchen Fall auf Effizienzgründen ignoriert.)
                      Wenn Sie die TIMESTAMP-Spalte explizit auf NULL setzen.
                      TIMESTAMP-Spalten abgesehen von der ersten können ebenfalls auf das aktuelle Datum und die aktuelle Zeit gesetzt werden. Setzen Sie die Spalte einfach auf NULL oder auf NOW().

                      Sie können jede TIMESTAMP-Spalte auf einen Wert setzen, der vom aktuellen Datum und der aktuellen Zeit abweicht, indem Sie sie explizit auf den gewünschten Wert setzen. Das gilt sogar für die erste TIMESTAMP-Spalte. Sie können diese Eigenschaft benutzen, wenn Sie einen TIMESTAMP auf das aktuelle Datum und die aktuelle Zeit setzen wollen, wenn Sie eine Zeile erzeugen, nicht aber, wenn die Zeile später aktualisiert wird:

                      Lassen Sie MySQL die Spalte setzen, wenn die Zeile erzeugt wird. Das initialisiert sie auf das aktuelle Datum und die aktuelle Zeit.
                      Wenn Sie nachfolgende Aktualisierungen anderer Spalten in der Zeile durchführen, setzen Sie die TIMESTAMP-Spalte explizit auf ihren aktuellen Wert."
                      -----------------------------------------------------

                      meine lösung quartalsabfrage:
                      PHP-Code:
                      $datum date("d.m.Y");                                        //deutsches datum
                      echo "<form method='POST' action='$PHP_SELF'>";
                      echo 
                      "<input type='text' name='datum_deu' value='$datum'>";
                      echo 
                      "<input type='submit' value='Speichern'>";

                      $part explode(".",$datum_deu);                            // deutsches format
                      $datum $part[2]."-".$part[1]."-".$part[0];                // umwandeln
                      $sql "UPDATE tab_test SET datum='$datum' WHERE id='1'";    // in DB schreiben  (spalte datum ist typ "DATE")

                      // DB abfrage 4. quartal:

                      $aa 9;    // quartalsanfang
                      $ee 12;    // quartalsende

                      $res mysql_query("SELECT datum FROM ta_test WHERE MONTH(datum) between $aa AND $ee");
                      $row = @mysql_fetch_row($res);

                      $part explode("-",$row[0]);                                // format in deutsches format
                      $datum_deu $part[2].".".$part[1].".".$part[0];            // umwandeln 
                      etwas besseres fällt mir dazu nicht ein.
                      gruss, wolfgang

                      Kommentar


                      • #12
                        @breww
                        ja, genau. Hab ich ja gemeint

                        Deine Lösung fin ich gut, nur müsste man noch das Jahr einbauen.
                        Grüße an alle und weiterhin frohes Arbeiten

                        Kommentar


                        • #13
                          PHP-Code:
                          <?php
                          echo "<form method='POST' action='$PHP_SELF'>";
                          echo 
                          "<input type='text' name='datumD' value='".date("d")."' size=2>.";
                          echo 
                          "<input type='text' name='datumM' value='".date("m")."' size=2>.";
                          echo 
                          "<input type='text' name='datumY' value='".date("Y")."' size=4>";
                          echo 
                          "<input type='submit' name='abdiepost' value='Speichern'>";

                          if (
                          $abdiepost) {
                             
                          mysql_connect("localhost""""")
                                 or print 
                          "&gt;&gt;&gt; MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error()."<br>\n";

                             
                          mysql_select_db("test")
                                or print 
                          "&gt;&gt;&gt; MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error()."<br>\n";
                                
                             
                          // hier wäre eine syntaktische Datumsprüfung vorteilhaft

                             
                          $query "UPDATE tab_test SET datum='$datumY-$datumM-$datumD' WHERE id='1'"// in DB schreiben

                             
                          $res mysql_query($query)
                                or print 
                          "&gt;&gt;&gt; MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error()."<br>\n";
                             
                             
                          $quartal 4;    // quartal
                             
                          $jahr 2002;    // jahr

                             
                          $query "SELECT date_format(datum,'%d.%m.%Y') as datum
                                           from tab_test
                                           WHERE quarter(datum)=
                          $quartal and date_format(datum,'%Y')=$jahr"

                             
                          $res mysql_query($query)
                                or print 
                          "&gt;&gt;&gt; MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error()."<br>\n";

                             while(
                          $row mysql_fetch_array($res)){
                                print 
                          "<h3>Das Datum im europäischen Format: $row[datum]<br></h3>\n";
                             }
                          }
                          ?>

                          Kommentar


                          • #14
                            @eSHa @hand,

                            danke für die beiträge.
                            ich wusste doch, dass meine lösung noch nicht die finale war.

                            ich werde es morgen implementieren/testen und melde mich dann.

                            vermutlich kommt dann noch eine ähnliche sache, aber vielleicht ist dazu ein neuer thread besser.

                            btw
                            wenn ein moderator mitliest:
                            ich hatte 'mal einen usernamen *****.
                            aus irgendeinem grund konnte ich mit dem originalnamen nicht mehr ins forum.
                            wo und wie kann ich denn den "dämlichen" useramen "breww" ändern?

                            gruss, wolfgang

                            Kommentar


                            • #15
                              Original geschrieben von breww
                              wo und wie kann ich denn den "dämlichen" useramen "breww" ändern?
                              PM an Berni: anklopfen, auf die Knie sinken und um Umbenennung betteln.
                              mein Sport: mein Frühstück: meine Arbeit:

                              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                              Kommentar

                              Lädt...
                              X