DATE-Datenbankspalten
Um eine Datumsangabe, beispielsweise den Registrierungszeitpunkt eines Benutzers, in der MySQL-Datenbank abzuspeichern hast du verschiedene Möglichkeiten. Zum einen kannst du ein INT-Feld definieren und dann einen Timestamp mittels time() erzeugen und in der Datenbank abspeichern. Meine persönliche Empfehlung ist aber die existenten Typen von MySQL zu verwenden .
Inhaltsverzeichnis
MySQL Typen für Datum und Zeit
Für Datum- und Zeitangaben existieren in MySQL die Feldtypen TIME, DATE, DATETIME und TIMESTAMP.
TIME lässt sich für reine Zeitangaben nutzen. Das Format ist HH:MM:SS und kann Werte zwischen -838:59:59 und 838:59:59 beinhaltet. Damit lassen sich also nicht nur Zeitpunkte während eines Tages bestimmen, sondern auch längere Zeitspannen, z.B. für 48 Stunden entsprechend 48:00:00.
DATE wird für reine Datumsangaben verwendet und Einträge werden im Format 'YYYY-MM-DD' abgespeichert. Felder mit entsprechendem Typ können Werte zwischen 1000-01-01 und 9999-12-31 abspeichern.
TIMESTAMP und DATETIME speichern beide Datums und Zeitangaben im Format 'YYYY-MM-DD HH:MM:SS' ab. DATETIME können Werte zwischen '1000-01-01 00:00:00' und '9999-12-31 23:59:59' abspeichern, während TIMESTAMP Werte zwischen '1970-01-01 00:00:01' UTC und '2038-01-19 03:14:07' UTC abspeichern kann. Der unterschied zwischen den beiden Typen ist nicht ganz leicht zu verstehen. DATETIME gibt ein Datum an, wie man diese in einem Kalender bzw. an einer Wanduhr finden kann. Bei TIMESTAMP wird die Zeitzone berücksichtigt und bei der Abspeicherung wird die Zeit entsprechend zur koordinierten Weltzeit (UTC) umgerechnet. Wenn eure Anwendung also ggf. unterschiedliche Zeitzonen beachten muss, solltet ihr entsprechend auf TIMESTAMP zurückgreifen.
Solltet ihr Daten vor 1970 brauchen (z.B. zum Abspeichern von Geburtsdaten) oder Daten nach 2038, solltet ihr DATETIME verwenden. Für andere Informationen, insbesondere für Metadaten wie der angesprochene Zeitpunkt der Registrierung, solltet ihr TIMESTAMP verwenden.
Datum per PHP eintragen
Nachdem ihr nun (hoffentlich) wisst, welche Feldtypen ihr nutzen wollt, geht es nun daran die Feldtypen in PHP zu verwenden. Möchtet ihr Werte in ein Zeit- bzw. Datumfeld eintragen, so übergebt ihr einen entsprechenden String im obigen Format, also z.B. 'YYYY-MM-DD' für DATE bzw. 'YYYY-MM-DD HH:MM:SS' für DATETIME/TIMESTAMP. Der passende Code um das aktuelle Datum einzutragen sieht wie folgt aus:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE tabelle SET zeitpunkt = ? WHERE id = 1"); $statement->execute(array(date('Y-m-d H:i:s')); ?> |
Das richtige Format bekommen wir, indem wir mittels der date()-Funktion es entsprechend generieren. Einen Überblick über die Werte für date() erhaltet ihr in unserem Artikel Datum und Uhrzeit. Falls ihr ein DATE-Feld habt, so nutzt ihr nur 'Y-m-d', bei einem TIME-Feld entsprechend 'H:i:s'.
Datum formatieren
Eher selten wollen wir das MySQL-Datenformat 'YYY-MM-DD HH:MM:SS' auch so auf der Website ausgeben, sondern beispielsweise ein deutsche Datumsformat wählen oder gewisse Informationen, wie z.B. die Sekunden, weglassen.
Dazu gibt es drei Varianten die wir euch im folgenden vorstellen. Die ersten beiden formatieren das Datum mittels SQL. Die dritte Variante, dir wir euch dringend empfehlen, ist die Formatierung des Formats mittels PHP.
Datum in PHP formatieren per strototime()
Die leichteste Methode ein Datum aus der Datenbank zu formatieren ist vermutlich die Kombination aus der Funktion strtotime() und date() . Mittel strtotime wird das Datum in einen Unix-Timestamp umgewandelt und mittels date könnt ihr das Datum wie im Artikel Datum und Uhrzeit beschrieben formatieren.
1 2 3 4 5 6 7 8 9 10 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT zeitpunkt FROM tabelle"); $statement->execute(array()); while($row = $statement->fetch()) { echo date('d.m.y H:i:s', strtotime($row['zeitpunkt']))."<br />"; } ?> |
Hinweis: Da das Datum in einen Unix-Timestamp umgewandelt wird, kann es zu Problemen kommen bei einem Datum dass vor dem 01.01.1970 oder nach dem 19.01.2038 liegt. Sollte das Datum also vor 1970 oder nach 2038 liegen, solltet ihr die nachfolgende DateTime-Klasse verwenden.
Datum in PHP formatieren per DateTime
Die DateTime()-Klasse steht seit PHP 5.2 zur Verfügung steht und erlaubt es euch bequem das Datum in ein beliebiges Format zu bringen. Anders als bei der vorherigen Methode habt ihr hier keine Probleme mit Daten die vor 1970 oder nach 2038 liegen.
Der Code sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("SELECT zeitpunkt FROM tabelle"); $statement->execute(array()); while($row = $statement->fetch()) { $date = new DateTime($row['zeitpunkt']); echo $date->format('d.m.y H:i:s')."<br />"; } ?> |
Zuerst erzeugt ihr ein DateTime()-Objekt und übergibt diesen euren Datumsangabe aus MySQL. Mittels der Methode $date->format($formatierung) könnt ihr dann das Datum in einem anderen Format wieder ausgeben. Hier könnt ihr wieder die gleichen Formatierungsoptionen wie bei der Funktion date() verwenden. Die wichtigsten sind
Format | Funktion | Beispiel |
---|---|---|
d | Tag des Monats, zweistellig | 04, 15 |
j | Tag des Monats, einstellig | 5, 23 |
m | Nummer des Monats, zweistellig | 05, 12 |
n | Nummer des Monats, einstellig | 4, 11 |
y | Jahr, zweistellig | 98, 05 |
Y | Jahr, vierstellig | 1998, 2005 |
H | Stunden im 24-Stunden-Format, zweistellig | 04, 18 |
G | Stunden im 24-Stunden-Format, einstellig | 4, 14 |
i | Minuten, zweistellig | 04, 32 |
s | Sekunden, zweistellig | 02, 55 |
w | Wochentag in Zahlenwert, 0 für Sonntag, 6 für Samstag | 1, 5 |
Dank der Klasse DateTime() haben wir eine einfache Möglichkeit, um Datums- und Zeitangaben die von MySQL kommen in unser gewünschtes Format zu formatieren.
MySQL Timestamp formatieren
Ihr könnt euer Datum auch in der SELECT-Abfrage in andere Formate bringen. Sofern eure Datums- und Zeitangabe zwischen dem 01.01.1970 und dem 19.01.2038 liegt, ihr also ein TIMESTAMP-Feld nutzt, könnt ihr die MySQL-Funktion UNIX_TIMESTAMP verwenden um aus dem Datum einen Unix-Timestamp zu generieren:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); //Variante 1, mittels dem SQL-Befehl UNIX_TIMESTAMP $statement = $pdo->prepare("SELECT UNIX_TIMESTAMP(zeitpunkt) AS zeitpunkt FROM tabelle"); $statement->execute(array()); while($row = $statement->fetch()) { echo date('d.m.y H:i:s', $row['zeitpunkt']))."<br />"; } ?> |
In den entsprechenden date()-Anweisungen könnt ihr natürlich auch jedes andere Datumsformat wählen.
MySQL Datetime formatieren
Solltet ihr ein Datum vor 1970 haben, z.B. ein Geburtsdatum, oder ein Datum nach 2038, so funktioniert der obere Wege nicht mehr zuverlässig, da mittels Unix-Timestamp (aktuell) nur Datenangaben in dieser Zeitspanne angegeben werden kann. Aber ihr habt dort andere Möglichkeiten, auf die ihr zurückgreifen könnt. Wenn ihr also ein DATETIME-Feld oder DATE-Feld nutzt, verwendet eine der folgenden Möglichkeiten. Diese Variante funktioniert natürlich auch für TIMESTAMP-Felder.
Die erste Variante ist es mittels der MySQL-Funktion DATE_FORMAT() zu lösen. Eure SQL-Query kann dazu wie folgt aussehen:
1 |
SELECT DATE_FORMAT(zeitpunkt, '%d.%m.%Y %H:%i:%s') AS zeitpunkt FROM tabelle |
Ähnlich wie in PHP geben wir den Formatierungsstring an. In diesem Fall wird aus 2015-08-15 10:21:54 ein Datum im Format 15.05.2015 10.21.54. Natürlich könnt ihr dort auch ein beliebig anderes Format wählen. Im folgenden die wichtigsten Formatierungselemente für MySQL:
Format | Funktion | Beispiel |
---|---|---|
%d | Tag des Monats, zweistellig | 04, 15 |
%e | Tag des Monats, einstellig | 4, 15 |
%m | Nummer des Monats, zweistellig | 05, 12 |
%c | Nummer des Monats, einstellig | 5, 12 |
%y | Jahr, zweistellig | 98, 05 |
%Y | Jahr, vierstellig | 1998, 2005 |
%H | Stunden im 24-Stunden-Format, zweistellig | 04, 18 |
%k | Stunden im 12-Stunden-Format, einstellig | 4, 14 |
%i | Minuten, zweistellig | 04, 32 |
%s | Sekunden, zweistellig | 02, 55 |
%w | Wochentag in Zahlenwert, 0 für Sonntag, 6 für Samstag | 1, 5 |