Die Typen DATETIME
, DATE
und TIMESTAMP
gehören zusammen. In diesem
Abschnitt werden ihre Eigenschaften sowie Gemeinsamkeiten und
Unterschiede beschrieben.
Den Typ DATETIME
verwenden Sie, wenn Sie
Werte benötigen, die sowohl ein Datum als auch eine Uhrzeit
enthalten. MySQL ruft DATETIME
-Werte im
Format 'YYYY-MM-DD HH:MM:SS'
ab und zeigt sie
auch so an. Der unterstützte Bereich liegt zwischen
'1000-01-01 00:00:00'
und
'9999-12-31 23:59:59'
.
(„Unterstützt“ bedeutet hier, dass früher
liegende Werte zwar funktionieren können, dies aber nicht
garantiert ist.)
Der Typ DATE
erlaubt die Benutzung eines
Datums ohne Zeitangabe. MySQL ruft DATE
-Werte
im Format 'YYYY-MM-DD'
ab und zeigt sie auch
so an. Der unterstützte Bereich liegt zwischen
'1000-01-01'
und
'9999-12-31'
.
Der Datentyp TIMESTAMP
schließlich hat je
nach MySQL-Version und SQL-Modus des Servers verschiedene
Eigenschaften, die im Verlauf dieses Abschnitts noch beschrieben
werden.
Sie können DATETIME
-,
DATE
- und TIMESTAMP
-Werte
mit einem der folgenden gängigen Formate angeben:
Als String im Format 'YYYY-MM-DD
HH:MM:SS'
oder 'YY-MM-DD
HH:MM:SS'
. Eine weniger strikte Syntax ist
ebenfalls erlaubt: Ein beliebiges Interpunktionszeichen darf
als Trennzeichen zwischen Datums- oder Zeiteinheiten benutzt
werden. Beispielsweise sind '98-12-31
11:30:45'
, '98.12.31 11+30+45'
,
'98/12/31 11*30*45'
und
'98@12@31 11^30^45'
gleichwertig.
Als String im Format 'YYYY-MM-DD'
oder
'YY-MM-DD'
. Eine weniger strikte Syntax
ist auch hier erlaubt. Beispielsweise sind
'98-12-31'
,
'98.12.31'
, '98/12/31'
und '98@12@31'
gleichwertig.
Als String ohne Trennzeichen in den Formaten
'YYYYMMDDHHMMSS'
oder
'YYMMDDHHMMSS'
, sofern der String als
Datum sinngebend ist. Zum Beispiel werden
'19970523091528'
und
'970523091528'
als '1997-05-23
09:15:28'
interpretiert, aber
'971122129015'
ist unzulässig (der
Minutenanteil ist unsinnig) und wird deswegen zu
'0000-00-00 00:00:00'
.
Als String ohne Trennzeichen in den Formaten
'YYYYMMDD'
oder
'YYMMDD'
, sofern der String als Datum
sinngebend ist. Zum Beispiel werden
'19970523'
und
'970523'
als
'1997-05-23'
interpretiert, aber
'971332'
ist unzulässig (der Tages- und
der Minutenanteil sind unsinnig) und wird deswegen zu
'0000-00-00'
.
Als Zahl in den Formaten YYYYMMDDHHMMSS
oder YYMMDDHHMMSS
, sofern die Zahl als
Datum sinngebend ist. Beispielsweise werden sowohl
19830905132800
als auch
830905132800
als '1983-09-05
13:28:00'
interpretiert.
Als Zahl in den Formaten YYYYMMDD
oder
YYMMDD
, sofern die Zahl als Datum
sinngebend ist. Beispielsweise werden sowohl
19830905
als auch
830905
als
'1983-09-05'
interpretiert.
Als Ergebnis einer Funktion, die einen Wert zurückgibt, der
im Kontext von DATETIME
,
DATE
oder TIMESTAMP
sinngebend ist, z. B. NOW()
oder
CURRENT_DATE
.
Unzulässige DATETIME
-,
DATE
- oder TIMESTAMP
-Werte
werden in den „Nullwert“ des entsprechenden Typs
umgewandelt ('0000-00-00 00:00:00'
oder
'0000-00-00'
).
Bei als Strings angegebenen Werten, die Trennzeichen für
Datumsbestandteile enthalten, ist es nicht erforderlich, zwei
Stellen für Monats- oder Tageswerte anzugeben, die kleiner als
10
sind. So wird etwa
'1979-6-9'
als
'1979-06-09'
ausgewertet. Ähnlich ist es bei
als Strings angegebenen Werten, die Trennzeichen für
Uhrzeitbestandteile enthalten, nicht erforderlich, zwei Stellen
für Stunden-, Minuten oder Sekundenwerte anzugeben, die kleiner
als 10
sind: '1979-10-30
01:02:03'
ist das Gleiche wie '1979-10-30
1:2:3'
.
Als Zahlen angegebene Werte sollten eine Länge von 6, 8, 12
oder 14 Stellen haben. Wenn eine Zahl 8 oder 14 Stellen lang
ist, werden die Formate YYYYMMDD
bzw.
YYYYMMDDHHMMSS
angenommen, wobei das Jahr
durch die ersten vier Stellen angegeben wird. Umfasst die Zahl 6
oder 12 Stellen, dann werden die Formate
YYMMDD
bzw. YYMMDDHHMMSS
angenommen, wobei das Jahr durch die ersten beiden Stellen
angegeben ist. Zahlen, die eine andere Länge aufweisen, werden
so interpretiert, als ob sie am Anfang mit Nullen auf die
nächste Länge aufgefüllt würden.
Werte, die als Strings ohne Trennzeichen angegeben werden,
werden entsprechend ihrer Länge interpretiert. Ist der String 8
oder 14 Zeichen lang, dann wird angenommen, dass die ersten vier
Zeichen das Jahr angeben. Andernfalls wird die Jahresangabe
durch die ersten zwei Zeichen erwartet. Der String wird von
links nach rechts interpretiert, als Reihenfolge wird Jahr,
Monat, Tag, Stunde, Minute und Sekunde angenommen – je
nachdem, wie viele Bestandteil im String vorhanden sind. Das
bedeutet, dass Sie niemals Strings mit weniger als sechs Zeichen
verwenden sollten. Wenn Sie beispielsweise
'9903'
angeben, um den März 1999
darzustellen, dann fügt MySQL einen „Nullwert“
für das Datum in Ihre Tabelle ein. Dies geschieht, weil die
Jahres- und Monatsangaben 99
bzw.
03
sind, der Tag aber vollständig fehlt: Der
Wert ist kein gültiges Datum. Sie können jedoch ausdrücklich
einen Wert Null zur Darstellung fehlender Monats- oder
Tagesangaben spezifizieren. So können Sie etwa
'990300'
verwenden, um den Wert
'1999-03-00'
einzufügen.
Sie können bis zu einem gewissen Grad Werte eines Datumstyps einem Objekt zuweisen, welches von einem anderen Datumstyp ist. Allerdings kann es hierdurch zu Werteänderungen oder Datenverlust kommen:
Wenn Sie einen DATE
-Wert einem
DATETIME
- oder
TIMESTAMP
-Objekt zuweisen, wird die
Uhrzeit des resultierenden Werts auf
'00:00:00'
gesetzt, da
DATE
diese Information nicht enthält.
Wenn Sie einen DATETIME
- oder
TIMESTAMP
-Wert einem
DATE
-Objekt zuweisen, wird die Uhrzeit
des resultierenden Werts gelöscht, weil der Typ
DATE
diese Information nicht speichert.
Beachten Sie, dass DATETIME
-,
DATE
- und
TIMESTAMP
-Werte zwar alle in denselben
Formatvarianten angegeben werden können, aber die Typen
nicht dieselben Wertebereiche aufweisen. So kann ein
TIMESTAMP
-Wert nicht vor
1970
und nicht nach
2037
liegen. Das bedeutet, dass ein Datum
wie '1968-01-01'
zwar als
DATETIME
- und
DATE
-Wert zulässig, als
TIMESTAMP
-Wert jedoch illegal ist und
deswegen zu 0
konvertiert wird.
Beachten Sie die folgenden Widrigkeiten bei der Angabe von Datumswerten:
Das weniger strikte Format, welches die Angabe von Werten
als Strings gestattet, kann heimtückisch sein. So sieht
etwa ein Wert wie '10:11:12'
wegen des
als Trennzeichen verwendeten Doppelpunkts
(‘:
’) wie eine Uhrzeit aus,
in einem Datumskontext wird er jedoch als
'2010-11-12'
interpretiert. Der Wert
'10:45:15'
wird zu
'0000-00-00'
konvertiert, weil
'45'
kein zulässiger Monat ist.
Für den Server ist es erforderlich, dass Monats- und
Tagesangaben gültig sind und sich nicht einfach nur in den
Bereichen 1 bis 12 bzw. 1 bis 31 bewegen. Wenn der strikte
Modus deaktiviert ist, werden ungültige Daten wie
'2004-04-31'
in
'0000-00-00'
umgewandelt, und es wird
eine Warnung erzeugt. Ist der strikte Modus hingegen
aktiviert, dann erzeugen ungültige Datumsangaben einen
Fehler. Um derartige Daten zuzulassen, aktivieren Sie
ALLOW_INVALID_DATES
. Weitere
Informationen finden Sie in
Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Datumsangaben mit zwei Stellen für die Jahreszahl sind mehrdeutig, da das Jahrhundert unbekannt ist. MySQL interpretiert Werte mit zweistelligen Jahreszahlen gemäß den folgenden Regeln:
Jahreszahlen im Bereich zwischen 00 und 69 werden als
2000-2069
interpretiert.
Jahreszahlen im Bereich zwischen 70 und 99 werden als
1970-1999
interpretiert.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.