Das Format eines DATE
-Werts ist
'YYYY-MM-DD'
. Im Standard-SQL ist kein
anderes Format erlaubt. Dieses Format muss in
UPDATE
-Ausdrücken und in der
WHERE
-Klausel von
SELECT
-Anweisungen immer verwendet werden.
Zum Beispiel:
mysql> SELECT * FROM tbl_name
WHERE date >= '2003-05-05';
Der Bequemlichkeit halber konvertiert MySQL ein Datum, das in
einem numerischen Kontext benutzt wird, automatisch in eine Zahl
(und umgekehrt). MySQL ist auch clever genug, um bei Updates und
in einer WHERE
-Klausel, die ein Datum mit
einer TIMESTAMP
-, DATE
-
oder DATETIME
-Spalte vergleicht, eine
„lockere“-String-Form zuzulassen. („Lockere
Form“ bedeutet, dass zwischen den einzelnen Teilen jedes
Interpunktionszeichen als Trennzeichen zulässig ist. So sind
zum Beispiel '2004-08-15'
und
'2004#08#15'
äquivalent.) MySQL kann auch
einen String, der keine Trennzeichen enthält (wie etwa
'20040815'
) konvertieren, vorausgesetzt, er
ergibt einen vernünftigen Datumswert.
Wenn Sie Werte vom Typ DATE
,
TIME
, DATETIME
oder
TIMESTAMP
mit einem konstanten String
vergleichen, der die Operatoren <
,
<=
, =
,
>=
, >
oder
BETWEEN
enthält, konvertiert MySQL den
String normalerweise intern in einen langen Integer, um
Vergleiche schneller ausführen zu können (und ein wenig
„locker“ bei der String-Prüfung sein zu können).
Von dieser Konvertierung gibt es allerdings folgende Ausnahmen:
wenn Sie zwei Spalten vergleichen
wenn Sie eine DATE
-,
TIME
-, DATETIME
- oder
TIMESTAMP
-Spalte mit einem Ausdruck
vergleichen
wenn Sie eine andere Vergleichsmethode als die oben
aufgeführten verwenden, wie etwa IN
oder
STRCMP()
In diesen Ausnahmefällen führt MySQL den Vergleich durch, indem es die Objekte in Strings konvertiert und dann die Strings vergleicht.
Um sicherzugehen, sollten Sie davon ausgehen, dass Strings als Strings verglichen werden, und die passenden Funktionen einsetzen, wenn Sie einen Temporalwert mit einem String vergleichen möchten.
Das spezielle Datum '0000-00-00'
kann als
'0000-00-00'
gespeichert und abgerufen
werden. Wenn Sie ein '0000-00-00'
-Datum in
MyODBC benutzen, so wird es in MyODBC 2.50.12 und höher
automatisch in NULL
konvertiert, da ODBC mit
Datumswerten dieser Art nicht umgehen kann.
Da MySQL die oben beschriebenen Konvertierungen vornimmt, funktionieren folgende Anweisungen:
mysql>INSERT INTO
mysql>tbl_name
(idate) VALUES (19970505);INSERT INTO
mysql>tbl_name
(idate) VALUES ('19970505');INSERT INTO
mysql>tbl_name
(idate) VALUES ('97-05-05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('1997.05.05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('1997 05 05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('0000-00-00');SELECT idate FROM
mysql>tbl_name
WHERE idate >= '1997-05-05';SELECT idate FROM
mysql>tbl_name
WHERE idate >= 19970505;SELECT MOD(idate,100) FROM
mysql>tbl_name
WHERE idate >= 19970505;SELECT idate FROM
tbl_name
WHERE idate >= '19970505';
Doch die folgende Anweisung funktioniert nicht:
mysql> SELECT idate FROM tbl_name
WHERE STRCMP(idate,'20030505')=0;
Da STRCMP()
eine String-Funktion ist,
konvertiert sie idate
in einen String im
Format 'YYYY-MM-DD'
und führt einen
String-Vergleich durch. '20030505'
wird nicht
in das Datum '2003-05-05'
konvertiert, um
einen Datumsvergleich durchzuführen.
Wenn Sie den SQL-Modus ALLOW_INVALID_DATES
eingestellt haben, gestattet MySQL Ihnen die Speicherung von
Datumswerten bei nur rudimentärer Überprüfung: MySQL verlangt
lediglich, dass der Tag im Bereich von 1 bis 31 und der Monat im
Bereich von 1 bis 12 liegt.
Dadurch eignet sich MySQL gut für Webanwendungen, bei denen Jahr, Monat und Tag in drei verschiedenen Feldern abgerufen werden und in denen Sie genau das, was der Benutzer eingibt, speichern möchten (ohne das Datum zu validieren).
Wenn Sie nicht den SQL-Modus NO_ZERO_IN_DATE
SQL verwenden, kann der Tag oder der Monat null sein. Das ist
praktisch, wenn Sie in einer DATE
-Spalte
einen Geburtstag speichern möchten, dessen Datum Sie nur
teilweise kennen.
Wenn Sie nicht den SQL-Modus NO_ZERO_DATE
verwenden, gestattet Ihnen MySQL auch,
'0000-00-00'
als „Dummy-Datum“
zu speichern. Das ist manchmal praktischer als
NULL
-Werte.
Wenn sich das Datum nicht in einen vernünftigen Wert
konvertieren lässt, wird eine 0
in der
DATE
-Spalte gespeichert und als
'0000-00-00'
abgerufen. Dies ist eine Frage
von Schnelligkeit und Bequemlichkeit. Wir sind der Ansicht, dass
der Datenbankserver dieselben Daten liefern sollte, die
gespeichert wurden (selbst wenn diese Daten im Einzelfall nicht
immer logisch richtig sind). Wir denken, dass es Sache der
Anwendung ist, die Datumswerte zu überprüfen.
Wenn Sie wollen, dass MySQL die Daten überprüft und nur
gültige zulässt (es sei denn, dies wird durch IGNORE außer
Kraft gesetzt), müssen Sie den sql_mode
auf
"NO_ZERO_IN_DATE,NO_ZERO_DATE"
einstellen.
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.