malabadi: CURRENT_TIMESTAMP auf Stunden vergleichen.

Hallo an alle,
ich habe eine (MYSQL) Tabelle("AntwortSession") die bei jedem neueingefügten
Datensatz die Spalte "Date" mit Current_Timestamp ausfüllt.
 Ich versuche jetzt in meinem PHP-Script mit folgender Anweisung
 die Einträge zu gruppieren. Es klappt auch problemlos.
$res_antwortsession = mysql_query("select * from antwortsession where fg_ID=$fragengruppe group by Date ASC");

Was ich machen will ,ist aber jede Gruppe nicht sekundengenau
zu gruppieren ,sondern Stundengenau.

Wieviele Einträge gibt es in jeder Stunde (Fals es welche gibt)
D.H. bei meiner Abfrage gibt es sehr viele Einträge (fast jeder
Datensatz wird angezeigt,weil es ja im Format jjjj:mm:dd hh:mm:ss
ist.Wichtig ist aber eine Gruppierung nach jjjj:mm:dd hh.

Ich habe alternativ im PHP-Script folgendes versucht:
$today = date("Y-m-d-H");
$res_antwort=mysql_query("insert into antwortsession  (fg_ID,fr_ID,a_ID,date) values ($fg_ID,$fr_ID,$antwort,'$today')");

also eine manuelle Zeiteingabe in die Spalte "DAte"

Somit hatte ich dann bei Minute und sekunde 00:00. Das Problem war aber diesmal,dass die Zeit falsch war. Ich kann auch nicht
feststellen ,woher mit date() die Zeit gelesen wird. Windows Uhrzeit
läuft richtig.
Kann mir da vielleicht jemand bei einem der beiden Wegen weiterhelfen ?
Gruß
Ridvan Cinar

  1. Hi,

    Ich habe alternativ im PHP-Script folgendes versucht:
    $today = date("Y-m-d-H");
    $res_antwort=mysql_query("insert into antwortsession  (fg_ID,fr_ID,a_ID,date) values ($fg_ID,$fr_ID,$antwort,'$today')");

    also eine manuelle Zeiteingabe in die Spalte "DAte"

    Somit hatte ich dann bei Minute und sekunde 00:00. Das Problem war aber diesmal,dass die Zeit falsch war. Ich kann auch nicht
    feststellen ,woher mit date() die Zeit gelesen wird. Windows Uhrzeit
    läuft richtig.

    Hast du den richtigen Typ für Date definiert (char(13))?

    Ich würde folgendes machen. Die Spalte date als Integer definieren und dann bei jeder INSERT-Anweisung den Timestamp für die jetzige Stunde mit übergeben.

      
    $today = mktime(date('G'), 0, 0, date('n'), date('j'), date('Y'));  
    $res_antwort=mysql_query("insert into antwortsession  (fg_ID,fr_ID,a_ID,date) values ($fg_ID,$fr_ID,$antwort,$today)");  
    
    

    (vobei die Bezeichnung $today nicht allzu treffend ist ;)

    Gruß,
    Felix

    --
    Real life should have a fucking search function.
    1. echo $begrüßung;

      Hast du den richtigen Typ für Date definiert (char(13))?

      Der richtige Typ für ein Datum ist DATE. Wenn noch ein Zeitanteil dabei ist, dann ist es DATETIME. Wenn man den mit TIMESTAMP verbundenen Zauber verwenden will, dafür aber einen eingeschränkten Wertebereich in Kauf nehmen kann, dann ist es TIMESTAMP. Alles andere ist meist ungünstig, auch wenn es auf den ersten Blick nicht so aussehen mag.

      http://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html

      Ich würde folgendes machen. Die Spalte date als Integer definieren und dann bei jeder INSERT-Anweisung den Timestamp für die jetzige Stunde mit übergeben.

      Auch ein Integertyp ist nicht sehr passend für eine Zeitangabe. MySQL bietet spezielle Typen für Datum/Zeit-Werte an, die man tunlichst verwenden sollte, wenn man damit innerhalb MySQLs zu rechnen oder sie auszuwerten gedenkt.

      Wenn einem nur ein Unix-Timestamp-Wert zur Verfügung steht, sollte man ruhig den Aufwand betreiben, ihn umzuwandeln (FROM_UNIXTIME()), wenn man die Vorteile eines Datum/Zeit-Feldtyps nicht ungenutzt verschenken will.

      echo "$verabschiedung $name";

      1. Hi dedlfix,

        Ich würde folgendes machen. Die Spalte date als Integer definieren
        und dann bei jeder INSERT-Anweisung den Timestamp für die jetzige
        Stunde mit übergeben.

        hmm,
        wieso soviel Aufwand (siehe oben) ... ;)

        Und im Uebrigen ist das Format eines MySQL-Timestamp-Feldes in keiner
        Weise an das Format des UNIX-Timestamps angelehnt und unterliegt auch
        nicht dessen Beschraenkungen.
        Es ist ein DateTime-Feld ohne Trennzeichen, z.B.: '20071113193157'.

        Gruss Norbert

        1. echo $begrüßung;

          Und im Uebrigen ist das Format eines MySQL-Timestamp-Feldes in keiner
          Weise an das Format des UNIX-Timestamps angelehnt

          Das stimmt so nicht. Das standardmäßige Aus- und Eingabeformat eines MySQL-Timestamps ist seit Version 4.1 das gleiche wie bei einem DATETIME-Feld. Zuvor war es ebenfalls gleich, nur ohne Trennzeichen dazwischen.

          und unterliegt auch nicht dessen Beschraenkungen.

          Für ein TIMESTAMP-Feld verwendet MySQL 4 Bytes zur Speicherung, die genau wie beim Unix-Timestamp die Sekunden seit 1.1.1970 0:00:00 UTC repräsentieren. Damit unterliegt der Wertebereich den gleichen Einschränkungen wie bei Unix-Timestamps. DATETIME ist mit 8 Bytes und einer definierten Unterstützung vom 1.1.1000 0:00:00 bis 31.12.9999 23:59:59 deutlich umfangreicher.

          Es ist ein DateTime-Feld ohne Trennzeichen, z.B.: '20071113193157'.

          Diese Aussage gilt bis einschließlich Version 4.0, ab 4.1 nicht mehr.

          echo "$verabschiedung $name";

          1. Hallo,

            Es ist ein DateTime-Feld ohne Trennzeichen, z.B.: '20071113193157'.
            Diese Aussage gilt bis einschließlich Version 4.0, ab 4.1 nicht mehr.

            na super,
            und wo ist da dann die Entwicklung zum Positiven?
            Wenn den Entwicklern schon nix ordentliches mehr einfaellt, sollten
            sie das Produkt und die Anwender doch einfach mal in Ruhe lassen.
            Ich hasse diese Versions-Yunkies ... :-((

            Gruss Norbert

  2. echo $begrüßung;

    $res_antwortsession = mysql_query("select * from antwortsession where fg_ID=$fragengruppe group by Date ASC");
    Was ich machen will ,ist aber jede Gruppe nicht sekundengenau zu gruppieren ,sondern Stundengenau.

    Es gibt eine Menge Date and Time Functions unter MySQL. Einige davon extrahieren Teile eines Datum/Zeit-Feldes, andere formatieren ein solches Feld in alle möglichen Varianten. Diese Funktionen kann man auch in der GROUP-BY-Klausel verwenden.

    Ich kann auch nicht feststellen ,woher mit date() die Zeit gelesen wird.

    Diese Auskunft gibt dir das PHP-Handbuch zur Funktion date().
    "... using the given integer timestamp or the current time if no timestamp is given." Diese "current time" kann natürlich nur eine dem ausführenden Script bzw. Rechner bekannte Zeit sein.

    echo "$verabschiedung $name";

  3. Hallo Ridvan Cinar,

    Was ich machen will ,ist aber jede Gruppe nicht
    sekundengenau zu gruppieren, sondern Stundengenau.

    hmm,
    dann musst Du halt stundengenau selectieren,
    z.B.:
    SELECT COUNT(*),
           DATE_FORMAT(ZeitSpalte,'%Y%m%d%H') AS grpp
    FROM deineTabelle GROUP BY grpp;

    Bei mir sah das z.B. so aus:
    |     2007 | 2005123011 |
    |     2097 | 2005123012 |
    |     1842 | 2005123013 |
    |     1755 | 2005123014 |
    |     1364 | 2005123015 |
    |     1190 | 2005123016 |
    |     1466 | 2005123017 |
    |     1136 | 2005123018 |
    |     1058 | 2005123019 |
    |      528 | 2005123020 |
    |      221 | 2005123021 |
    |       90 | 2005123022 |
    |      121 | 2005123023 |
    +----------+------------+
    8613 rows in set from 11307666 records (32.02 sec)

    Gruss Norbert

    1. Danke für die Antwort,
      da ich die php.dateien nicht hier habe, muss ich leider bis morgen warten um es auszuprobieren.
      Die Abfrage über SQL (PHPmyAdmin) ergibt aber das gleiche Ergebnis wir bei dir.
      Ich denke also es müsste klappen. Kann man denn das angezeigte
      Datum weiter als Variable benutzen? also z.B
      select * from antwortsession where etwas=$etwas and zeitSpalte=grpp; ?
      Nach dem Motto zeige mir jetzt alle Einträge, die in der (irgendeiner) gruppierten Zeit sind.
      Meine dateSpalte hat die Form 2007-11-14 22:38:15

    2. Hallo Norbert,
      Deine Abfrage hat mir sehr geholfen. Es funktioniert problemlos.
      Danke für den Tipp.
      Das zweite Problem habe ich durch herumprobieren auch gelöst.
      Also wenn ich eine dieser Gruppierten Zeiten wähle, kann ich das Datum-Uhrzeit
      weiter benutzen mit z.B. folgender select:
      select * from antwortsession where blabla=$blabla and DATE_FORMAT(Date,'%Y%m%d%H')='$grpp';

      vorher natürlich $grpp=antwortsession["grpp"];

      Danke nochmals an alle,die mir helfen wollten.
      Ridvan Cinar