Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
[PHP] Rechnen mit Datums in PHP & MySQL
- Ersteller Toby
- Erstellt am
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
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
AlbertLast
Lieutenant
- Registriert
- Juni 2002
- Beiträge
- 715
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 !
mh1001
Lt. Commander
- Registriert
- Nov. 2003
- Beiträge
- 2.039
Naja, so verallgemeinern lässt sich dies auch nicht.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 !
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:
JayKay
Cadet 4th Year
- Registriert
- Apr. 2004
- Beiträge
- 89
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...
ag3nt
Lieutenant
- Registriert
- Okt. 2002
- Beiträge
- 689
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
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
mh1001
Lt. Commander
- Registriert
- Nov. 2003
- Beiträge
- 2.039
Probiers mal mit folgendem Code :
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.
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:
ag3nt
Lieutenant
- Registriert
- Okt. 2002
- Beiträge
- 689
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):
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.
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.
AlbertLast
Lieutenant
- Registriert
- Juni 2002
- Beiträge
- 715
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 ....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
mh1001
Lt. Commander
- Registriert
- Nov. 2003
- Beiträge
- 2.039
Ja, dies ist natürlich vollkommen richtig.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 ....
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
AlbertLast
Lieutenant
- Registriert
- Juni 2002
- Beiträge
- 715
ach ich bin 1988 geboren daher hab ich kein prob damit
*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:
Ich vermute mal die zweite Bedinung habe ich falsch verkettet....aber wie ist es richtig ?
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 ?
mh1001
Lt. Commander
- Registriert
- Nov. 2003
- Beiträge
- 2.039
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:
MfG mh1001
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
Zuletzt bearbeitet:
Ähnliche Themen
- Antworten
- 1
- Aufrufe
- 2.397
- Antworten
- 9
- Aufrufe
- 4.193
- Antworten
- 7
- Aufrufe
- 1.769
- Antworten
- 8
- Aufrufe
- 5.678
- Antworten
- 3
- Aufrufe
- 1.196