Einträge > jetzt aus Datenbank auslesen, Timestamp = Zahl

Hallo Community,

ich schreibe für unsere Klasse ein Script, bei dem jeder (mit Passwort) Hausaufgaben eintragen kann. Das Datum, bis wann die Hausaufgaben aufgegeben sind liegt in der Datenbank als Float (große Ganzzahl; für PHP Float, für die DB BIGINT).

Nun möchte ich mit folgendem Code alle Einträge auswählen, welche noch nicht abgelaufen sind (Das Datum bezieht sich auf den Tag, 7:50 = Schulanfang).

$now = time();
$sql = "SELECT * FROM `".DBTBL."` WHERE `to` > ".((FLOAT) $now)." GROUP BY `subject` ORDER BY `to` ASC";

Ich habe folgende Einträge:

Französisch,kra,Mo., den 2.3.2009 Mathe,wum,Mi., den 6.5.2009 Französisch ,es,Sa., den 6.6.2009 Mathe,knallt,Do., den 24.2.2011 Mathe,so,Sa., den 22.7.2023 Mathe,richtig...,Do., den 24.7.2025 Deutsch,götz akt 4+5 lesen,Di., den 27.3.2035

Kriege jedoch nur die mit den daten:
6.6.09, 22.7.23, 27.3.35

Waran liegt das? Habe ich mich mit den Variablentypen verstrickt, oder liegt es an der Query? Danke euch schonmal für die meist schnelle Hilfe :wink:

Greez:

jw-lighting

“Verstrickt” hast du dich beim Tabellenlayout - als du darauf verzichtet hast, einen der Datumstypen dafür zu nutzenl, den MySQL anbietet.

Den Typen kannst du gefahrlos jetzt ändern, alle Daten sollten von den Timestamps übernommen werden :wink:

Ich habe es mir gedacht… Wenn man sichs einfach machen will, wird man hinterher doch wieder bestraft…

Dann werde ich mich jetzt ans ändern machen.

Wie kann ich den Wert aus der Datenbank den dann am Besten wieder in einen Timestamp (für date()) umwandeln? Als String auseinandrnehmen, und die einzelnen Array-Elemente in mktime(), oder strtotime()?

Timestamps als INT sind für mich jetzt auf jeden Fall gestorben :wink:
Thx euch beiden :smiley:

EDIT: Übernommen in ein Datum hat der die alten Werte übrigens nicht…

Erst mal schauen, ob man überhaupt date braucht - einiges an Formatierungen können auch die Datumsfunktionen von MySQL schon leisten.

Hatte ich eigentlich die Datumsfunktionen von MySQL schon erwähnt …?

:wink:

OK. Ich sehe schon, eine gute SQL-Lektüre wäre mal ganz gut. Ich weiss, das du solche Fragen nicht so gerne magst, könntest du mir vllt trotzdessen den Code für einen String im Format (Wt., TT.MM.) geben? (Wt. -> Wochentag abgekürzt, 2 stellig)

dev.mysql.com/doc/refman/5.1/en/ … tions.html

Danke. ich habe mich jetzt für den select mit NOW() bedient, das auslesen mach ich wegen des wochentags mit einer normalen ausgabe, und strtotime sowie date. das steht soweit auch, eintragen geht mit date(‘c’,$timestamp). Jedoch habe ich noch ein problem mit der Group by klausel in meiner query:

normal funktioniert die ausgabe, sobald ich das group by einsetze, gibt er mir nur einen eintrag pro fach zurück. ich möchte aber lediglich, das er mir alle einträge eines fachs zusammenpackt, wenn diese am selben tag sind.

natürlich ist der mensch vor der maschine falsch, nicht die maschine. aber was muss ich dort einsetzen?

Problem gelöst:

Wieso strtotime? Wenn du einen Unix Timestamp haben willst, lasse dir von der Datenbank einen liefern.

Ich dachte, du hättest NOW() bereits entdeckt.

Dann ist also das bis auf den Tag heruntergebrochene Datum dein Grupierungskriterium - also erstelle dir ein solches. (Oder Alternativ, gruppiere einzeln nach den Datumsbestandteilen bis auf “Tag” hinunter.)

Da hast du allerdings recht. !coffee

ja, für das aktuelle Datum sicherlich. Allerdings geht es hier darum, den Tag einzutragen, zu dem die Hausaufgaben auf sind, und das ist nunmal nicht jetzt. :wink:

das verstehe ich nicht, wozu eins erstellen, wenn ich eins habe? meinst du, ich soll mir eine Int-Spalte anlegen, nach der ich sortiere? Das wäre zu aufwändig, da ich ja das Datum schon habe, und das sortiren danach klappt super. Das Problem lag nur darin, auch noch alle Aufgaben für das selbe fach am selben tag untereinander zu bekommen… da war dann die lösung im sortiren, nicht gruppieren. :slight_smile:

Was ich nicht nicht ganz geblickt habe, ist weshalb man bei group by immer nur einen eintrag pro wert zurückkriegt. er soll sie doch lediglich zusammenpacken (gruppieren), nicht selektieren… o.0

Danke auf jeden Fall schonmal soweit :hail: :wink2:

Nein, du hast ja ursprünglich gesagt, dass es ums Gruppieren ginge.
Und mit Erstellen meinte ich natürlich nicht das anlegen einer weiteren Spalte.

Weil GROUP BY per Definition genau das macht - Datensätze zusammenfassen. um bspw. aufsummierte Einzelwerte zu erhalten.

Das hat mit Gruppierung in dem Sinne, wie es bei einer Datenbank definiert ist, nichts zu tun.

Du meintest also wirklich lediglich Sortieren.

ok, dann hab ichs jetzt geblickt :wink:

Habe mich jetzt mal nach SQL-Lektüre umgesehen, hat da vllt jemand eine spezielle Empfehlung im Preisbereich bis 30€?