[PHP] Rechnen mit Datums in PHP & MySQL

Toby

Cadet 4th Year
Registriert
Mai 2003
Beiträge
107
Hallo zusammen,

wie errechnet ihr folgendes Beispiel:

Code:
$gesuchtes Datum = $heute + 30 Tage


gruss
Toby
 
Hallo,

je nachdem, wie dir die Daten vorliegen kannst du diese mit mktime() in einen UNIX-Timestamp umwandeln, addieren und anschließend wieder date() entsprechend formatieren.

MfG mh1001
 
Danke mh,

für die schnelle Antwort...aber geht die mktime-funktion auch wenn die Daten im MySQL-Date-format vorliegen ??

z.B. "2005-11-26"

Hierzu möchte ich gerne 30 Tage addieren und mit dem Ergebnisdatum weiterarbeiten ...

gruss
Toby
 
PHP:
$datumsarray = explode("-", $gegebenes_datum);

$jahr = $datumsarray[0];
$monat = $datumsarray[1];
$tag = $datumsarray[2];

//dann obiges...
Ungetestet, sollte aber funktionieren. ;)

MfG mh1001
 
Zuletzt bearbeitet:
Stimmt - eigentlich logisch... ;)

Danke Dir, nochmals !

gruss
Toby
 
Toby schrieb:
Danke mh,

für die schnelle Antwort...aber geht die mktime-funktion auch wenn die Daten im MySQL-Date-format vorliegen ??

z.B. "2005-11-26"

Hierzu möchte ich gerne 30 Tage addieren und mit dem Ergebnisdatum weiterarbeiten ...

gruss
Toby

Das wirde ich sagen ist sehr dum das so zu machen weil du unflexibel bsit daher empfielt sich es imemr timestamp zu benutzen !
 
AlbertLast schrieb:
Das wirde ich sagen ist sehr dum das so zu machen weil du unflexibel bsit daher empfielt sich es imemr timestamp zu benutzen !
Naja, so verallgemeinern lässt sich dies auch nicht. ;)
Der Zeitbereich bei Timestamps ist vom Jahr 1970 bis 2037 limitiert. Der "DATE"-Typ erlaubt jedoch Angaben zwischen dem Jahr 0 und 9999.
Das Update des Timestamps bei jeder Update-Anweisung muss auch nicht unbedingt bei jeder Anwendung erwünscht sein. ;)
Daneben ist noch anzumerken, dass ein Feld vom Typ "DATE" drei Byte und ein Feld vom Typ "Timestamp" vier Byte belegt.

MfG mh1001
 
Zuletzt bearbeitet:
AlbertLast schrieb:
Das wirde ich sagen ist sehr dum das so zu machen weil du unflexibel bsit daher empfielt sich es imemr timestamp zu benutzen !

*zustimm*

schau dir mal strtotime() an... da lässt sich dein ziel sehr leicht realisieren [-> strtotime(+ 30 days)]

vor allem sparst du dir die zerlegung des datums...
 
Toby schrieb:
...aber geht die mktime-funktion auch wenn die Daten im MySQL-Date-format vorliegen ??

z.B. "2005-11-26"

Hierzu möchte ich gerne 30 Tage addieren und mit dem Ergebnisdatum weiterarbeiten...

Hallo Toby, was genau meinst du mit das Datum liegt im MySQL-Format vor?
Falls du damit meinst das Datum kommt aus einer MySQL-Datenbank dann sieh dir im Handbuch mal die Funktionen UNIX_TIMESTAMP und ADDDATE an, dass könnte dann z.B. so aussehen:
Code:
SELECT ADDDATE( CURDATE(), 30) AS gesuchtesDatum
 
Hallo nochmal,

erstmal mercy an alle für Eure tolle Beteilung an meiner Frage.
Doch leider bin ich mittlerweile als Anfänger noch ziemlich verwirrt.

Ich schildere Euch mal den Sinn der Sache.

Ich möchte per PHP auf eine MySQL-Datenbank zugreifen in der diverse Datensätze gespeichert sind.

Es sollen folgende Datensätze ausgelesen werden:
Alle Datensätze gleich HEUTE UND + 30 Tage !

Die Datenbank besteht aus einer simplen Tabelle.
In dieser Tabelle ist ein Feld 'datum' (Typ: date).


1. Frage:
Wäre es für diese Abfrage besser wenn das Feld 'Datum' den Typ: time (also UNIX-Timestamp) hätte ?

2. Frage:
Wie sieht die SQL-Abfrage dafür aus ?
Ich denke es geht in die Richtung die ag3nt schon angesprochen hat...


gruss
Toby
 
Probiers mal mit folgendem Code ;) :

Code:
SELECT spalte FROM tabelle WHERE datumsspalte <= DATE_ADD(CURDATE(), INTVAL 30 DAY)

MfG mh1001

//Edit:

zu Frage 1:

Wenn für deine Anwendungen ansonsten auch kein Timestamp gebraucht wird, bzw. du keinen Nutzen von den speziellen Timestamp-Eigenschaften machen kannst/brauchst, ist dies auch absolut überflüssig. ;)

//Edit 2:

Ich hatte die gewünschten Ergebnis-Datensätze vertauscht. Richtig heißen muss die Abfrage in diesem Fall natürlich dann so, wie sie ag3nt gepostet hat. ;)
 
Zuletzt bearbeitet:
also in dem Fall ist es am besten du formulierst die Bedingung komplett innerhalb der SQL-Abfrage, das sieht dann für dein Bespiel so aus( Anpassungen musst du natürlich noch selbst vornehmen):
Code:
SELECT <spalten> 
FROM <tabelle> 
WHERE datum BETWEEN CURDATE() AND ADDDATE( CURDATE(), INTERVAL 30 DAY )

Generell ist es egal wie die Datenbank das Datum speichert, da es genügend Funktionen gibt die das Datum für die Ausgabe entsprechend umformatieren, also benutz auch weiterhin das MySQL-eigene Datumsformat.
 
mh1001 schrieb:
Naja, so verallgemeinern lässt sich dies auch nicht. ;)
Der Zeitbereich bei Timestamps ist vom Jahr 1970 bis 2037 limitiert. Der "DATE"-Typ erlaubt jedoch Angaben zwischen dem Jahr 0 und 9999.
Das Update des Timestamps bei jeder Update-Anweisung muss auch nicht unbedingt bei jeder Anwendung erwünscht sein. ;)
Daneben ist noch anzumerken, dass ein Feld vom Typ "DATE" drei Byte und ein Feld vom Typ "Timestamp" vier Byte belegt.

MfG mh1001
Jetzt lass uns nicht klein karriert werden bis 2030 werden alle computer system auf 64 bit umgestellt sein dann ist das für ein paar jahr hinaus geschoben ....
 
AlbertLast schrieb:
Jetzt lass uns nicht klein karriert werden bis 2030 werden alle computer system auf 64 bit umgestellt sein dann ist das für ein paar jahr hinaus geschoben ....
Ja, dies ist natürlich vollkommen richtig. ;)
Wie auch aus der MySQL-Refernz zu entnehmen ist, wird dafür schon entsprechend vorgesorgt.
Es ging viel mehr darum, zu betonen, dass dies stark vom Einsatz abhängig ist.
Beim Speichern aktueller Daten wird dies zu keinen Problemen führen.
Speichert man zum Beispiel aber Geburtsdaten oder sonst was, so stehen wir schon wieder vor der Thematik mit 1970. ;)

MfG mh1001
 
*hüstl* ... ich hätt da noch ne Frage...

Die SQL-Abfrage liefert mir in folgender Ausführung die gewünschten Ergebnisse:
(Die Lösung mit Between hätte bestimmt genauso funktioniert nur habe ich mich da irgendwie mit der Syntax verhaspelt)

select * FROM tabelle WHERE datum <= DATE_ADD(curedate(),INTERVAL 30 DAY)



jetzt würde ich gerne noch folgendes Kriterium hinzufügen:
select * FROM tabelle WHERE check = 1 (Ein Feld um die Datensätze später freizuschalten)



Beide Abfragen einzeln funktionieren schön brav, aber wenn ich die beiden Abfragen folgenderweise kombiniere:
select * FROM tabelle WHERE datum <= DATE_ADD(curedate(),INTERVAL 30 DAY) AND WHERE check = 1

erhalte ich folgende Fehlermeldung:
Code:
SQL-Befehl :  

select * FROM tabelle WHERE datum <= DATE_ADD(curedate(),INTERVAL 30 DAY) AND WHERE check = 1 LIMIT 0, 30

MySQL meldet: 


You have an error in your SQL syntax near '(),INTERVAL 30 DAY) AND WHERE check = 1 LIMIT 0, 30' at line 1

Ich vermute mal die zweite Bedinung habe ich falsch verkettet....aber wie ist es richtig ? :(
 
Wenn du mehrere Bedingungen festlegen möchtest, so kannst du diese statt in mehreren WHERE-Klauseln einfach in einer mit einem entsprechendem Operator einsetzen. ;)

Dies würde dann bei deinem Problem zum Beispiel folgendermaßen aussehen:

Code:
SELECT * FROM tabelle WHERE datum BETWEEN CURDATE() AND DATE_ADD(CURDATE( ) , INTERVAL 30 DAY ) AND check = 1
MfG mh1001
 
Zuletzt bearbeitet:
Zurück
Oben