enrico: Problem mit sql abfrage

Hallo zusammen,

ich bin ein MySql Anfänger und hab ein Problem mit einer Abfrage. Hab auch schon gesucht, leider bin ich mir nicht sicher wonach genau ich suchen muss und hab deshalb auch noch keine Antwort gefunden.

Ich habe eine Tabelle mit folgenden Feldern:

name, datum, begin, ende, min

In den Feldern begin und ende können mehrere Einträge innerhalb 1 Stunde sein.

Also z.B.
name1, 01.01.2000, 12:20, 12:23, 3
name1, 01.01.2000, 12:25, 12:33, 8
name1, 01.01.2000, 12:34, 12:37, 3
name1, 01.01.2000, 12:38, 12:48, 10
name1, 01.01.2000, 12:48, 12:55, 7

da es extrem unübersichtlich wird, wenn alle Daten angezeigt werden, würde ich diese gern in Stunden gruppieren.

Die Ausgabe soll dann ungefähr so aussehen:

name1, 01.01.2000, 12 Uhr, 13 Uhr, 31 min

Ist das mit einer SQL-Abfrage machbar oder muss ich die Daten im PHP Code zusammen fummeln.

Ich hoffe Ihr könnt mir helfen.

Vielen Dank im Voraus
Gruß
Enrico

  1. Hallo

    name, datum, begin, ende, min

    In den Feldern begin und ende können mehrere Einträge innerhalb 1 Stunde sein.

    name1, 01.01.2000, 12:20, 12:23, 3
    name1, 01.01.2000, 12:25, 12:33, 8
    name1, 01.01.2000, 12:34, 12:37, 3
    name1, 01.01.2000, 12:38, 12:48, 10
    name1, 01.01.2000, 12:48, 12:55, 7

    grundsätzlich bin ich der Ansicht, dass Du auf die Spalte "datum" verzichten könntest und statt dessen bei den Spalten "begin" und "ende" den Datentyp DATETIME verwenden solltest. Die Spalte min wäre somit redundant, da sich der Inhalt dieser Spalte aus Beginn und Ende berechnen ließe. So ist Ende redundant, da ende sich aus Datum, Beginn und Min berechnen läßt. Weiterhin ist der Spaltenname "min" schlecht gewählt, Du solltest diesen besser vermeiden.

    name2, 01.01.2000, 23:58, 00:02, 4

    Waa machst Du damit?

    Die Ausgabe soll dann ungefähr so aussehen:

    name1, 01.01.2000, 12 Uhr, 13 Uhr, 31 min

    Ist das mit einer SQL-Abfrage machbar oder muss ich die Daten im PHP Code zusammen fummeln.

    Vermutlich nicht mit einem einfachen SQL-Statement: Du musst schließlich diverse nette Fälle betrachten, z.B:

    name3, 28.02.2008, 23:58, 00:02, 1444

    Freundliche Grüße

    Vinzenz

    1. echo $begrüßung;

      Weiterhin ist der Spaltenname "min" schlecht gewählt, Du solltest diesen besser vermeiden.

      Ergänzend: MIN ist zwar kein resierviertes Wort, aber der Name einer Funktion. Eine Verwechslungsgefahr besteht jedoch nicht, weil hinter einem Funktionsnamen immer eine (-Klammer folgt. Mir fällt auch grad kein Syntax-Beispiel ein, bei dem "min" als Spaltenbezeichner eine öffnende Klammer folgen darf.
      Schlecht ist der Name trotzdem, weil er wenig Aussagekraft hat und mehrdeutig ist (z.B. Min-uten vs. Min-imum).

      Die Ausgabe soll dann ungefähr so aussehen:
      name1, 01.01.2000, 12 Uhr, 13 Uhr, 31 min
      Ist das mit einer SQL-Abfrage machbar oder muss ich die Daten im PHP Code zusammen fummeln.
      Vermutlich nicht mit einem einfachen SQL-Statement: Du musst schließlich diverse nette Fälle betrachten, z.B:
         name3, 28.02.2008, 23:58, 00:02, 1444

      So schwierig erscheint es mir, und die "netten Fälle" auch nicht als "nette Fallen". Wenn datum vom Typ DATE ist, und begin vom Typ TIME ist, sowie die Minutenzahl (INT) verwendet werden, und das redundante ende ignoriert wird, dann kann man sich a) aus datum und begin einen konkreten Anfangszeitpunkt zusammensetzen, b) unter Hinzunahme der min den Endzeitpunkt berechnen, und c) dann jeweils die gewünschten Informationen mit DATE_FORMAT() bestimmen:

      a) ADDTIME(datum, begin)
      b) ADDTIME(datum, begin) + INTERVAL min MINUTE
      c) siehe Handbuch: DATE_FORMAT()

      Etwas einfacher wird es natürlich wenn, wie schon erwähnt, mindestens datum und begin eine gemeinsame DATETIME-Spalte bildeten. Leider wird es (zumindest nach meinen Beobachtungen und Tests für diese Antwort) nicht einfacher, wenn das Ende ebenfalls eine vollständige DATETIME-Spalte wird und man die Dauer als Minutenzahl benötigt. Die lässt sich dann am einfachsten nur über TIMEDIFF(), TIME_TO_SEC() und einer Division durch 60 ermitteln, also in drei Schritten statt einer Addition nach b).

      Meine Empfehlung an den OP: Nimm dir das Kapitel Date and Time Functions, verschaff dir einen Überblick über die vorhandenen Funktionen und experimentiere mit ihnen. Verwende dabei auch ungewöhnliche Werte, Werte, die einen Datums- und/oder Monatswechsel beinhalten, und auch die Winter-/Sommer-Zeitumstellung beinhalten.

      echo "$verabschiedung $name";