Datum formatieren?

markberg

Erfahrenes Mitglied
Hallo,

habe in meiner DB "date" also jjjj.mm und möchte dies aber in tt.mm.jj haben! Und dann sortiert ab immer aktuellen Datum ausgeben!
Habe das erste zunächst einmal so realisiert, zeigt mir aber beim echo einfach mal nichts an?

PHP:
$SQLString = "SELECT * FROM DB136497.kalender WHERE kategorie LIKE 'Party' ORDER BY datum LIMIT 20 ";
$datum = date("Y-m-d");  
function datum($datum) { 
$datum = explode("-", $datum);     
echo $datum[2].".".$datum[1].".".$datum[0]; 
} 
							
$Ergebnis = mysql_query($SQLString, $Verbindung);
if ($Ergebnis) {
$Datensatz = mysql_fetch_array ($Ergebnis); /// usw. usw.
 
Also wenn Du nur das Jahr und den Monat in der Datenbank hast, wo soll dann der Wert für den Tag herkommen?
Ich empfehle zum Sortieren das Konvertieren in eine Un*x-Timestamp mit hilfe der Funktion mktime.
 
Du solltest in der Datenbank immer als Datenfeld den Typ DATE oder DATETIME verwenden. Bei DATE wird nur das Datum (aber vollständig mit Tag, Monat, Jahr) gespeichert, bei DATETIME auch die Uhrzeit. Aus deiner Frage geht nicht eindeutig hervor, ob du das schon so machst.

Mit einem solchen Datumsfeld kannst du dann die Abfragen direkt mit "ORDER BY datumsfeld" sortieren, wenn "datumsfeld" das Feld vom Typ DATE oder DATETIME ist.

Wenn du nur die Daten ab dem aktuellen (heutigen) Datum haben willst, geht das mit der WHERE-Klausel: Zum Beispiel:

Code:
select DATE_FORMAT(datumsfeld, '%d.%m.%y') 
from kalender WHERE datumsfeld >= NOW()
ORDER BY datumsfeld LIMIT 20

Das gibt dir dann die nächsten 20 Termine von einschließlich heute im Format tt.mm.jj aus.

Die Beschreibung der Funktion DATE_FORMAT findest du hier:
http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html

Gruß

Marian
 
Hallo,
erstmal vielen Dank für Deine Erklärung, das habe ich verstanden...
Ich habe ja das Datenfeld Typ DATE (Feldname: datum)...
Ich habe aber das Problem, dass ich bei der Abfrage alles abfragen möchte wo im Feldnamen Kategorie 'Party' ist und dazu das Datum in der Ausgabe TT.MM.JJ. Habe dazu gedacht die WHERE als Variable zu bestimmen und dann alles sortiert auszugeben. Das haut aber bei mir irgendwie nicht hin. Habe das im Mom so gebastelt:

PHP:
$where= "`kategorie` LIKE 'Party' AND DATE_FORMAT(datum, '%d.%m.%y') datum >= NOW()"
$SQLString = "SELECT * FROM DB136497.kalender ".$where."  ORDER BY datum LIMIT 20";
$Ergebnis = mysql_query($SQLString, $Verbindung);
if ($Ergebnis) {
$Datensatz = mysql_fetch_array ($Ergebnis);
while ($Datensatz) {
echo '<table width=\'580\'>';
echo '<tr><td width=\'80\' valign=\'bottom\'><b>'.$Datensatz["wochentag"].', '.$Datensatz["datum"].'</b></td><td width=\'170\' valign=\'bottom\'>'.$Datensatz["headline"].'</td><td width=\'165\' valign=\'bottom\'>'.$Datensatz["musik"].'</td><td width=\'100\' valign=\'bottom\'>'.$Datensatz["location"].'</td><td width=\'50\' valign=\'bottom\'><a href ="partyinfos.php?id='.$Datensatz['id'].' " target=\"_blank\"><font size="1">mehr</font></a></td></tr>';
echo '<tr><td colspan=\'5\' bgcolor=\"000000\" height=1></td><td></td></tr>';
 
Schau mal in deine $where-Variable; da ist bei DATE_FORMAT einmal "datum" zuviel.
Es müsste so lauten:
PHP:
$where= "`kategorie` LIKE 'Party' AND DATE_FORMAT(datum, '%d.%m.%y') >= NOW()";
Desweiteren hast Du das abschließende ";" vergessen.
 
Dein WHERE sieht sehr merkwürdig aus.
Versuche es doch mal so:
Code:
SELECT
  Feld1, #alle gewünschten Felder der Tabelle
  Feld2, #außer datum einzeln auflisten
  ...,
  DATE_FORMAT(datum, '%d.%m.%y') AS datumFormatiert
FROM DB136497.kalender
WHERE
  `kategorie` LIKE 'Party' 
   AND datum >= NOW()
ORDER BY datum
LIMIT 20

Gruß hpvw
 
Zuletzt bearbeitet:
Hallo hpvw!
Vielen Dank Dat haut hin... jedoch zeigt er mir auch alte Einträge bei einem Test an. Komme ich da mit einem Timestamp oder ähnlich hin, denn irgendwo muss ich doch dem script sagen, dass heutige Datum ist, also zeige von hier an alles zukünftige!
Hast Du da einen Denkanstoss für mich, wäre feini...
 
Eigentlich sollte das durch datum >= NOW() bereits abgefangen sein, zumindest, wenn das datum als DATE oder DATETIME in der Datenbank steht. Du kannst aber auch mal versuchen CURDATE() anstatt NOW() zu verwenden.

Gruß hpvw
 
Zurück