Monate mit PHP auslesen

 


Mighty Mike
Veteran

07.03.10
20:05 Uhr
Hallo Freunde der fröhlichen Webprogrammierung

Ich erfasse in einer MySQL Datenbank Timestamps (time()) von Einkäufen. Nun müsste ich jeden Monat eine „Monatsabrechnung“ erstellen.

Hat hier irgendjemand eine gute Idee, wie ich möglichst dynamisch (jeden 1.1 eines Monats der nächsten 15 Jahre hardcoden kann ja keine Lösung sein) zu einer Lösung komme?

Das Ziel sollte ein SQL query sein, der mir nur die x Resultate in der Periode des gewünschten Monates ausgibt. Und, wie gesagt, ich möchte das möglichst clever lösen können.

Kann man irgendwie den Timestamp vom 1.1.0x um 00:00 Uhr berechnen lassen?

Bin für jede Hilfe dankbar )

Edit:
Datum berechnen geht mit http://ch.php.net/mktime
Link zu diesem Beitrag in die Zwischenablage kopieren
loeffler
Veteran

07.03.10
20:09 Uhr
Schau dir dazu mal die mktime() Funktion an.
Link zu diesem Beitrag in die Zwischenablage kopieren
pdd
Stammgast

07.03.10
20:12 Uhr
Aus dem Kopf:

  1. SELECT id, date FROM table WHERE month(date) = $month;
Quelltext in Zwischenablage kopieren

Es sei denn du hast die Timestamps wirklich nur als VARCHAR abgelegt, dann kannst du natürlich nicht so einfach auf diese SQL Funktion zurückgreifen )
Link zu diesem Beitrag in die Zwischenablage kopieren
Mighty Mike
Veteran

07.03.10
20:30 Uhr
Oh, month(date) ist hier eine SQL kommando oder etwas mit PHP? Bräuchte ich nicht 2 Werte (anfang Monat - ende Monat) um ein kleiner / grösser als zu basteln? Ist sql so mächtig? debil

Ich habe die timestamps aktuell mit PHP generiert und dann als int(11) gepseichert. Sollte ich das mit SQL machen? Kann noch geändert werden, das Script ist noch nicht produktiv )
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

07.03.10
20:38 Uhr
mysql > DATETIME (auch als Feld „datetime“ anlegen) und du hast keinerlei sorgen mehr
Link zu diesem Beitrag in die Zwischenablage kopieren
Rusty
Veteran

07.03.10
21:07 Uhr
Leg eine neue Spalte für das Datum an (siehe phloo) und lass diesen MySQL-Befehl durchlaufen:


  1. UPDATE namedertabelle SET neuespalte = FROM_UNIXTIME(altespalte);
Quelltext in Zwischenablage kopieren
Link zu diesem Beitrag in die Zwischenablage kopieren
Mighty Mike
Veteran

07.03.10
21:21 Uhr
Wieso jetzt Update? Ich will doch nur auslesen?

Und kann ich mit DateTime sagen dass ich alles will, das älter als 6 Stunden ist? Mit Timestamp (so mache ich das im Moment) kann man das ja berechnen time() - 6 * 60 * 60

Spoiler (anzeigen):

Ich möchte heute Nacht wirklich nicht Seitenweise SQL / MySQL Dokus wälzen heul
Link zu diesem Beitrag in die Zwischenablage kopieren
Jonis
Veteran

07.03.10
21:38 Uhr
loeffler hatte ja schon mktime erwähnt, der timestamp ist ja fortlaufend, also im endeffekt kannst du ausgehend von deinem startdatum (hier: 1. des monats) alle ausgeben lassen, wahlweise auch eingegrenzt auf den gewünschten monat mit einer zweiten bedingung.

timestamp größer als start-timestamp

die anderen vorschläge der jungs mit einer zusätzlichen spalte zielen einfach darauf ab es dir mit der abfrage einfacher zu machen.
Link zu diesem Beitrag in die Zwischenablage kopieren
Mighty Mike
Veteran

07.03.10
22:14 Uhr
Ja, bei timestamp leuchtet mir das ein, aber DATETIME scheint da irgendwie anders zu sein...
Link zu diesem Beitrag in die Zwischenablage kopieren
Jonis
Veteran

07.03.10
22:33 Uhr
datetime ist das format YYYY-MM-DD HH:MM:SS, also einfach eine andere art und weise dein datum abzuspeichern.
http://dev.mysql.com/doc/refman/5.1/de/d...etime.html
Link zu diesem Beitrag in die Zwischenablage kopieren
Mighty Mike
Veteran

07.03.10
22:45 Uhr
Ja, das habe ich soweit verstanden )

Ich habe das Prinzip und die Möglichkeiten von Timestamp verstanden, man kann mit einfachsten Rechenoperationen Zeitunerschiede usw angeben. Wie sage ich jetzt aber dem DATETIME dass ich alles was x Stunden älter ist als jetzt (NOW()) haben möchte?

Oder anders gefragt, ist DATETIME weniger Flexibel als TIMESTAMP oder wie komme ich mit DATETIME an die Funktionalität von einem timestamp heran? (dazu suche ich im Moment noch etwas gescheites zu lesen)
Link zu diesem Beitrag in die Zwischenablage kopieren
Jonis
Veteran

07.03.10
23:11 Uhr
Editiert: 07.03.10, 23:18 Uhr
der hauptunterschied besteht sicher in der lesbarkeit für dich. ansonsten lässt sich alles umwandeln.

aktueller timestamp time()
datum zu timestamp mktime()
timestamp zu datum date()

eine übersicht findest du in der offiziellen dokumentation, hier die kategorie „datum/uhrzeit“-funktionen:
http://www.php.net/manual/de/ref.datetime.php

//e: ich selbst arbeite eigentlich nur mit timestamps, die umwandlung von datetime in lediglich ein datum braucht eben einen weiteren schritt mit substr() oder ggf. auch über den timestamp für andere teile. kann mich aber auch irren, möglicherweise gibt es eine funktion die ich nicht kenne )
Link zu diesem Beitrag in die Zwischenablage kopieren
Mighty Mike
Veteran

07.03.10
23:24 Uhr
Ja, die ganze PHP Geschichte kenne ich und so mache ich das im Moment.

Bin jetzt aber etwas verwirrt ob DATETIME jetzt mehr kann oder nicht. Bzw. ob ich mit DATETIME den Monat einfacher auslesen kann. Wobei ich so langsam den Verdacht habe, dass beides genau dasselbe ist, von MySQL DATETIME nur benutzerfreundlicher angezeigt wird. ouw

Vielen Dank für die Ausführungen allerseits )
Link zu diesem Beitrag in die Zwischenablage kopieren
marcus_a
Veteran

07.03.10
23:29 Uhr
Mighty Mike schrieb am 07.03.10, 23:24 Uhr:

Wobei ich so langsam den Verdacht habe, dass beides genau dasselbe ist, von MySQL DATETIME nur benutzerfreundlicher angezeigt wird.

genau so sehe ich das auch und meine zu wissen, dass es auch so ist. )
Link zu diesem Beitrag in die Zwischenablage kopieren
loeffler
Veteran

07.03.10
23:29 Uhr
Mighty Mike schrieb am 07.03.10, 22:45 Uhr:

Ich habe das Prinzip und die Möglichkeiten von Timestamp verstanden, man kann mit einfachsten Rechenoperationen Zeitunerschiede usw angeben. Wie sage ich jetzt aber dem DATETIME dass ich alles was x Stunden älter ist als jetzt (NOW()) haben möchte?

Dazu gibt es bspw. die Funktion DATEDIFF(datum1, datum2). Hier gibt es noch eine ganze Übersicht, über alle Date/Time Funktionen, die dir MySQL anbietet. Von den Möglichkeiten her ist es kein Problem, das, was du oben beschrieben hast, auch per MySQL-Abfrage zu filtern. Musst deine Abfragen dann nur etwas verschachteln.
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

08.03.10
00:10 Uhr
DATETIME ist viel einfacher und verständlicher als irgendein Timestamp in der DB.
Desweiteren berechnet man Zeit(unterschiede) nicht mit PHP, sondern lässt alles bereits in mySQL machen.

Stichwort ist INTERVAL, damit kannst du alles sekundengenau festlegen.
Hier findest du so ziemlich für alles wichtige ein Beispiel.
http://dev.mysql.com/doc/refman/5.1/de/d...tions.html ()
Link zu diesem Beitrag in die Zwischenablage kopieren
fabian
Überläufer

08.03.10
11:49 Uhr
Und falls man doch uuunbedingt Timestamps haben will, kann man einfach als DATETIME gespeicherte werte beim Rausholen aus der DB mit UNIX_TIMESTAMP (spalte) umwandeln...
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

08.03.10
12:01 Uhr
Achso, für deine Monatsabfrage, wäre das hier zB eine mögliche Lösung

SELECT ... WHERE MONTH(datumsspalte) = 'deinGesuchterMonat' AND YEAR(datumsspalte) = 'deinJahr'
Link zu diesem Beitrag in die Zwischenablage kopieren
 
#