DATE- und Zeittypen, die Zeitwerte darstellen, sind DATETIME, DATE, TIMESTAMP, TIME und YEAR. Jeder Zeittyp verfügt über einen Bereich gültiger Werte und einen „Null“-Wert, der verwendet wird, wenn ein unzulässiger Wert angegeben wird, den MySQL nicht darstellen kann. Der Typ TIMESTAMP verfügt über proprietäre automatische Aktualisierungsfunktionen, die später beschrieben werden.
MySQL gibt eine Warnung oder einen Fehler aus, wenn Sie versuchen, ein ungültiges Datum einzugeben. Sie können den SQL-Modus ALLOW_INVALID_DATES verwenden, um MySQL dazu zu bringen, bestimmte Datumsangaben zu akzeptieren, beispielsweise „1999-11-31“. Nützlich, wenn Sie einen „möglicherweise falschen“ Wert, den der Benutzer angegeben hat, in der Datenbank (z. B. in einem Webformular) für die zukünftige Verarbeitung speichern möchten. In diesem Modus überprüft MySQL nur, ob der Monatsbereich zwischen 0 und 12 und der Tagesbereich zwischen 0 und 31 liegt. Diese Bereiche können Null umfassen, da MySQL das Speichern von Tag/Monat und Datumsangaben ermöglicht, bei denen der Tag in einer DATE- oder DATETIME-Spalte Null ist. Dies ist nützlich, wenn eine Anwendung einen Geburtstag speichern muss, dessen genaues Datum Sie nicht kennen. Speichern Sie in diesem Fall einfach das Datum als „00.00.1999“ oder „00.01.1999“. Funktionen, die ein vollständiges Datum erfordern, wie DATE_SUB() oder DATE_ADD, liefern keine korrekten Ergebnisse, wenn Sie ein solches Datum speichern. (Wenn Sie nicht möchten, dass in Datumsangaben Nullen erscheinen, können Sie den SQL-Modus NO_ZERO_IN_DATE verwenden.)
MySQL ermöglicht auch das Speichern von „0000-00-00“ als „Pseudodatum“ (wenn der SQL-Modus NO_ZERO_DATE nicht verwendet wird). Dies ist in manchen Fällen praktischer als die Verwendung von NULL-Werten (und die Daten und Indizes beanspruchen weniger Platz).
Setzen Sie die Systemvariable sql_mode auf den entsprechenden Moduswert, um klarer zu wissen, welche Art von Datumsangaben MySQL unterstützen soll.
Die folgenden Punkte sollten bei der Arbeit mit Datums- und Uhrzeittypen beachtet werden:
· MySQL ruft Werte eines bestimmten Datums- oder Uhrzeittyps im Standardausgabeformat ab, tut es aber Am besten interpretieren Sie jeden von Ihnen angegebenen Wert als Eingabewertformat (z. B. wenn Sie einen Wert angeben, der einem Datums- oder Zeittyp zugewiesen oder mit diesem verglichen wird). Es werden nur die in den folgenden Abschnitten beschriebenen Formate unterstützt. Erwarten Sie, dass Sie gültige Werte angeben. Wenn Sie Werte in anderen Formaten verwenden, kann es zu unerwarteten Ergebnissen kommen.
· Daten mit zweistelligen Jahresangaben sind nicht eindeutig, da das Jahrhundert nicht bekannt ist. MySQL verwendet die folgenden Regeln, um zweistellige Jahreswerte zu interpretieren:
o Jahreswerte im Bereich 70-99 werden in 1970-1999 konvertiert.
o Der Jahreswert im Bereich von 00-69 wird in 2000-2069 umgerechnet.
· Obwohl MySQL versucht, Werte in verschiedenen Formaten zu interpretieren, sind Datumsangaben immer in der Reihenfolge Jahr-Monat-Tag (z. B. „98-09-04“) und nicht üblicherweise in der Reihenfolge Monat-Tag-Jahr wird anderswo verwendet oder in der Reihenfolge Tag-Monat-Jahr (z. B. „09-04-98“, „04-09-98“).
· MySQL wandelt einen Wert vom Typ Datum oder Uhrzeit automatisch in eine Zahl um, wenn der Wert in einem numerischen Kontext verwendet wird, und umgekehrt.
· Wenn MySQL auf einen Datums- oder Zeittypwert stößt, der außerhalb des gültigen Bereichs liegt oder für diesen Typ unzulässig ist (wie am Anfang dieses Abschnitts beschrieben), konvertiert es den Wert in den „Null“-Wert dieser Klasse . Eine Ausnahme besteht darin, dass TIME-Werte außerhalb des Bereichs auf den entsprechenden Endpunkt des TIME-Bereichs begrenzt werden.
Die folgende Tabelle zeigt das Format verschiedener „Null“-Werte. Bitte beachten Sie, dass die Verwendung dieser Werte Warnungen generiert, wenn der SQL-Modus NO_ZERO_DATE aktiviert ist.
Spaltentyp „Null“-Wert
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000
TIME '00:00:00'
YEAR 0000
· Der Wert „Null“ ist ein besonderer Wert, aber Sie können die Werte verwenden in der Tabelle angezeigt, um sie zu speichern oder zu referenzieren. Sie können auch den Wert „0“ oder 0 zum Speichern oder Referenzieren verwenden, was das Schreiben erleichtert.
· „Null“-Datums- oder Zeitwerte, die in MyODBC verwendet werden, werden in MyODBC 2.50.12 und höher automatisch in NULL konvertiert, da ODBC solche Werte nicht verarbeiten kann.
1. DATETIME-, DATE- und TIMESTAMP-Typen
1. TIMESTAMP-Attribut seit MySQL 4.1
DATETIME-, DATE- und TIMESTAMP-Typen sind verwandt. In diesem Abschnitt werden ihre Eigenschaften, ihre Gemeinsamkeiten und Unterschiede beschrieben.
Verwenden Sie den Typ DATETIME, wenn Sie einen Wert benötigen, der sowohl Datums- als auch Uhrzeitinformationen enthält. MySQL ruft DATETIME-Werte im Format „JJJJ-MM-TT HH:MM:SS“ ab und zeigt sie an. Der unterstützte Bereich ist „1000-01-01 00:00:00“ bis „9999-12-31 23:59:59“. („Unterstützt“ bedeutet, dass der vorherige Wert zwar funktionieren kann, es jedoch keine Garantie gibt).
Der Typ DATE sollte verwendet werden, wenn Sie nur den Datumswert ohne den Zeitteil benötigen. MySQL ruft DATE-Werte im Format „JJJJ-MM-TT“ ab und zeigt sie an. Der unterstützte Bereich ist „1000-01-01“ bis „9999-12-31“.
Die Eigenschaften des Spaltentyps TIMESTAMP sind nicht festgelegt und hängen von der MySQL-Version und dem SQL-Modus ab, in dem der Server ausgeführt wird. Diese Eigenschaften werden später in diesem Abschnitt beschrieben.
DATETIME-, DATE- und TIMESTAMP-Werte können in jedem gängigen Format angegeben werden:
· 'YYYY-MM-DD HH:MM:SS' oder 'YY-MM-DD HH: MM:SS 'Formatzeichenfolge. „Entspannte“ Syntax ist zulässig: Als Trennzeichen zwischen Datums- oder Uhrzeitteilen kann jedes Interpunktionszeichen verwendet werden. Zum Beispiel „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“. sind gleichwertig.
· Eine Zeichenfolge im Format „JJJJ-MM-TT“ oder „JJ-MM-TT“. Auch eine „entspannte“ Syntax ist hier zulässig. Beispielsweise sind „98-12-31“, „98.12.31“, „98/12/31“ und „98@12@31“ gleichwertig.
· Eine Zeichenfolge im Format „YYYYMMDDHHMMSS“ oder „YYMMDDHHMMSS“ ohne Trennzeichen, vorausgesetzt, die Zeichenfolge ist für Datumstypen sinnvoll. Beispielsweise werden „19970523091528“ und „970523091528“ als „1997-05-23 09:15:28“ interpretiert, aber „971122129015“ ist illegal (es hat einen bedeutungslosen Minutenteil) und wird zu „0000-00-00 00“. :00:00'.
· Eine Zeichenfolge im Format „JJJJMMTT“ oder „JJMMTT“ ohne Trennzeichen, vorausgesetzt, die Zeichenfolge ist für Datumstypen sinnvoll. Beispielsweise werden „19970523“ und „970523“ als „1997-05-23“ interpretiert, aber „971332“ ist illegal (es hat einen bedeutungslosen Monats- und Tagesteil) und wird zu „0000-00-00“.
· Eine Zahl im Format YYYYMMDDHHMMSS oder YYMMDDHHMMSS, sofern die Zahl für den Datumstyp sinnvoll ist. Beispielsweise werden 19830905132800 und 830905132800 als „1983-09-05 13:28:00“ interpretiert.
· Eine Zahl im Format JJJJMMTT oder JJMMTT, sofern die Zahl für den Datumstyp sinnvoll ist. Beispielsweise werden 19830905 und 830905 als „05.09.1983“ interpretiert.
· Das von der Funktion zurückgegebene Ergebnis ist für den DATETIME-, DATE- oder TIMESTAMP-Kontext geeignet, z. B. NOW() oder CURRENT_DATE.
Ungültige DATETIME-, DATE- oder TIMESTAMP-Werte werden in einen „Null“-Wert des entsprechenden Typs („0000-00-00 00:00:00“, „0000-00-00“ oder 00000000000000) umgewandelt ).
Für Zeichenfolgenwerte, die Datumsteiltrennzeichen enthalten, müssen keine zwei Ziffern angegeben werden, wenn die Tages- und Monatswerte kleiner als 10 sind. „1979-6-9“ ist dasselbe wie „1979-06-09“. Ebenso besteht bei Zeichenfolgenwerten, die Zeitteiltrennzeichen enthalten, keine Notwendigkeit, zwei Ziffern anzugeben, wenn die Stunden-, Minuten- und Sekundenwerte kleiner als 10 sind. „1979-10-30 1:2:3“ ist dasselbe wie „1979-10-30 01:02:03“.
Der numerische Wert sollte 6, 8, 12 oder 14 Ziffern lang sein. Wenn eine Zahl 8 oder 14 Ziffern lang ist, wird davon ausgegangen, dass sie im Format JJJJMMTT oder JJJJMMTDHHMMSS vorliegt, wobei die ersten 4 Ziffern das Jahr darstellen. Wenn die Zahl 6 oder 12 Ziffern lang ist, wird davon ausgegangen, dass sie im Format JJMMTT oder JJMMTDHHMMSS vorliegt, wobei die ersten beiden Ziffern das Jahr darstellen. Andere Zahlen werden so interpretiert, als ob sie auf die nächste Länge mit Nullen aufgefüllt würden.
Werte, die als Nicht-Qualifizierer-Strings angegeben werden, werden mit der angegebenen Länge interpretiert. Wenn die Zeichenfolge 8 oder 14 Zeichen lang ist, stellen die ersten 4 Ziffern das Jahr dar. Ansonsten geben die ersten beiden Ziffern das Jahr an. Interpretieren Sie jede in der Zeichenfolge vorkommende Komponente von links nach rechts, um die Werte für Jahr, Monat, Tag, Stunde, Minute und Sekunde zu ermitteln. Darin heißt es, dass Zeichenfolgen mit weniger als 6 Zeichen nicht verwendet werden sollten. Wenn Sie beispielsweise „9903“ angeben und denken, dass dies März 1999 bedeutet, fügt MySQL einen Datumswert „Null“ in Ihre Tabelle ein. Dies liegt daran, dass die Jahres- und Monatswerte 99 und 03 sind, der Tagesteil jedoch vollständig fehlt, sodass der Wert kein gültiges Datum ist. Sie können jedoch explizit einen Nullwert angeben, um den fehlenden Monats- oder Tagesteil darzustellen. Beispielsweise können Sie mit „990300“ den Wert „00.03.1999“ einfügen.
Bis zu einem gewissen Grad ist es möglich, einen Wert eines Datumstyps einem anderen Datumstyp zuzuweisen. Der Wert kann sich jedoch ändern oder einige Informationen verlieren:
· Wenn Sie einem DATETIME- oder TIMESTAMP-Objekt einen DATE-Wert zuweisen, wird der Zeitanteil des resultierenden Werts aus diesem Grund auf „00:00:00“ gesetzt der DATE-Wert. Keine Zeitinformationen enthalten.
· Wenn Sie einem DATE-Objekt einen DATETIME- oder TIMESTAMP-Wert zuweisen, wird der Zeitanteil des resultierenden Werts entfernt, da der DATE-Wert keine Zeitinformationen enthält.
· Denken Sie daran, dass DATETIME-, DATE- und TIMESTAMP-Werte zwar im gleichen Format angegeben werden können, die Bereiche für die verschiedenen Wertetypen jedoch unterschiedlich sind. Beispielsweise darf der TIMESTAMP-Wert nicht vor 1970 oder nach 2037 liegen. Dies weist darauf hin, dass ein Datum wie „01.01.1968“ zwar für DATETIME- oder DATE-Werte gültig ist, für TIMESTAMP-Werte jedoch nicht gültig ist und in 0 konvertiert wird, wenn es einem solchen Objekt zugewiesen wird.
Beachten Sie bestimmte Fallstricke bei der Angabe von Datumswerten:
· Das nicht strenge Format, das für als Zeichenfolgen angegebene Werte zulässig ist, kann irreführend sein. Beispielsweise kann der Wert „10:11:12“ aufgrund des Trennzeichens „:“ wie ein Zeitwert aussehen, aber wenn er in einem Datumskontext verwendet wird, wird der Wert als Jahr „2010-11-12“ interpretiert. Der Wert „10:45:15“ wird in „0000-00-00“ umgewandelt, da „45“ kein gesetzlicher Monat ist.
· Im nicht-strikten Modus führt der MySQL-Server nur grundlegende Prüfungen der Gültigkeit von Datumsangaben durch: Die Bereiche Jahr, Monat und Tag liegen jeweils zwischen 1000 und 9999, zwischen 00 und 12 und zwischen 00 und 31. Jedes Datum, das Teile außerhalb dieser Bereiche enthält, wird in „0000-00-00“ konvertiert. Beachten Sie, dass Sie weiterhin illegale Daten wie „31.04.2002“ speichern dürfen. Um sicherzustellen, dass die Daten gültig sind, wenn Sie den strikten Modus nicht verwenden, sollten Sie Ihre Bewerbung überprüfen.
Im strikten Modus werden illegale Daten nicht akzeptiert und nicht konvertiert.
· Daten mit zweistelligen Jahresangaben sind nicht eindeutig, da das Jahrhundert nicht bekannt ist. MySQL verwendet die folgenden Regeln, um zweistellige Jahreswerte zu interpretieren:
o Jahreswerte im Bereich von 00-69 werden in 2000-2069 umgewandelt.
o Jahreswerte im Bereich von 70-99 werden auf 1970-1999 umgerechnet.
1.1. TIMESTAMP-Attribut seit MySQL 4.1
Hinweis: In älteren Versionen von MySQL (vor 4.1) unterschieden sich die Eigenschaften des Spaltentyps TIMESTAMP in vielerlei Hinsicht erheblich von den in diesem Abschnitt beschriebenen. Wenn Sie alte TIMESTAMP-Daten konvertieren müssen, damit sie in MySQL 5.1 funktionieren, finden Sie weitere Informationen im MySQL 4.1-Referenzhandbuch.
Das Anzeigeformat der TIMESTAMP-Spalte ist das gleiche wie das der DATETIME-Spalte. Mit anderen Worten: Die Anzeigebreite ist auf 19 Zeichen festgelegt und das Format ist JJJJ-MM-TT HH:MM:SS.
Der MySQL-Server kann auch im MAXDB-Modus ausgeführt werden. Wenn der Server in diesem Modus läuft, ist TIMESTAMP gleich DATETIME. Das heißt, wenn der Server beim Erstellen der Tabelle im MAXDB-Modus ausgeführt wird, wird die TIMESTAMP-Spalte als DATETIME-Spalte erstellt. Das Ergebnis ist, dass die Spalte das DATETIME-Anzeigeformat verwendet, denselben Wertebereich hat und nicht automatisch mit dem aktuellen Datum und der aktuellen Uhrzeit initialisiert oder aktualisiert wird.
Um den MAXDB-Modus zu aktivieren, verwenden Sie beim Starten des Servers die Serveroption --sql-mode=MAXDB oder stellen Sie den SQL-Servermodus zur Laufzeit auf MAXDB ein, indem Sie die globale Variable sql_mode festlegen:
mysql> SET GLOBAL sql_mode=MAXDB;
Der Client kann den Server für seine Verbindung wie folgt im MAXDB-Modus laufen lassen:
mysql> SET SESSION sql_mode=MAXDB;
MySQL akzeptiert keine Zeitstempelwerte, die eine Null in der Tages- oder Monatsspalte enthalten oder unzulässige Datumswerte enthalten . Die einzige Ausnahme von dieser Regel ist der Sonderwert „0000-00-00 00:00:00“.
Sie können sehr flexibel bestimmen, wann TIMESTAMP initialisiert und aktualisiert werden soll und welche Spalten initialisiert und aktualisiert werden sollen:
· Sie können den aktuellen Zeitstempel als Standardwert und den automatisch aktualisierten Wert angeben. Sie können jedoch nur eines oder keines von beiden auswählen. (Es ist nicht möglich, dass eine Spalte ein Verhalten und eine andere Spalte ein anderes Verhalten auswählt.)
· Sie können angeben, welche TIMESTAMP-Spalte automatisch initialisiert oder auf das aktuelle Datum und die aktuelle Uhrzeit aktualisiert wird. Die 1. TIMESTAMP-Spalte wird nicht mehr benötigt.
Bitte beachten Sie, dass die unten besprochenen Informationen nur für TIMESTAMP-Spalten in Tabellen gelten, die ohne aktivierten MAXDB-Modus erstellt wurden. (Wie oben erwähnt, führt der MAXDB-Modus dazu, dass Spalten als DATETIME-Spalten erstellt werden.) Die Regeln, die die Initialisierung und Aktualisierung von TIMESTAMP-Spalten steuern, lauten wie folgt:
· Wenn die erste TIMESTAMP-Spalte in einer Tabelle als DEFAULT-Wert angegeben ist, kann sie nicht ignoriert werden. Der Standardwert kann CURRENT_TIMESTAMP oder ein konstanter Datums- und Uhrzeitwert sein.
· DEFAULT NULL ist dasselbe wie DEFAULT CURRENT_TIMESTAMP der ersten TIMESTAMP-Spalte. Für andere TIMESTAMP-Spalten wird DEFAULT NULL als DEFAULT 0 behandelt.
· Jede TIMESTAMP-Spalte in der Tabelle kann so eingestellt werden, dass sie automatisch mit dem aktuellen Zeitstempel initialisiert und/oder aktualisiert wird.
· In der CREATE TABLE-Anweisung können Sie die erste TIMESTAMP-Spalte auf eine der folgenden Arten deklarieren:
o Verwenden Sie die Klauseln DEFAULT CURRENT_TIMESTAMP und ON UPDATE CURRENT_TIMESTAMP, um den Standardwert zu verwenden aktuellen Zeitstempel und wird automatisch aktualisiert.
o Verwendet keine DEFAULT- oder ON UPDATE-Klausel, genau wie DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP.
o Verwenden Sie die DEFAULT CURRENT_TIMESTAMP-Klausel anstelle der ON UPDATE-Klausel. Der Standardwert verwendet den aktuellen Zeitstempel, wird jedoch nicht automatisch aktualisiert.
o Ohne die DEFAULT-Klausel, aber mit der ON UPDATE CURRENT_TIMESTAMP-Klausel hat die Spalte einen Standardwert von 0 und wird automatisch aktualisiert.
o Verwenden Sie den konstanten DEFAULT-Wert und der angegebene Standardwert wird aufgelistet. Wenn die Spalte eine ON UPDATE CURRENT_TIMESTAMP-Klausel hat, wird sie automatisch aktualisiert, andernfalls nicht.
Mit anderen Worten: Sie können den aktuellen Zeitstempel für den Anfangswert und den automatisch aktualisierten Wert verwenden, oder das eine oder das andere oder keines von beidem. (Sie können beispielsweise ON UPDATE angeben, um automatische Aktualisierungen zu ermöglichen, ohne dass die Spalten automatisch initialisiert werden.)
· Sie können CURRENT_TIMESTAMP, CURRENT_TIMESTAMP() oder NOW() in den Klauseln DEFAULT und ON UPDATE verwenden. Sie haben alle die gleiche Wirkung.
Die Reihenfolge der beiden Eigenschaften ist nicht wichtig. Wenn sowohl DEFAULT als auch ON UPDATE für eine TIMESTAMP-Spalte angegeben sind, kann einer der beiden vor dem anderen stehen.
Beispiel: Die folgenden Anweisungen sind äquivalent:
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
· Um eine automatische Standardeinstellung oder Aktualisierung für eine andere TIMESTAMP-Spalte als Spalte 1 anzugeben, müssen Sie den ersten TIMESTAMP drucken, indem Sie eine Konstante zuweisen DEFAULT-Wert zum Deaktivieren der automatischen Initialisierung und Aktualisierungen. (Zum Beispiel DEFAULT 0 oder DEFAULT '2003-01-01 00:00:00'). Für andere TIMESTAMP-Spalten gelten dann dieselben Regeln wie für die erste TIMESTAMP-Spalte, mit der Ausnahme, dass die Klauseln DEFAULT und ON UPDATE nicht ignoriert werden können. Wenn Sie dies tun, erfolgt keine automatische Initialisierung oder Aktualisierung.
Zum Beispiel: Folgende Aussagen sind äquivalent:
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Für jede Verbindung kann die aktuelle Zeitzone eingestellt werden. TIMESTAMP-Werte werden im UTC-Format gespeichert, beim Speichern in die aktuelle Zeitzone konvertiert und beim Abrufen wieder in die aktuelle Zeitzone konvertiert. Solange der Zeitzonen-Einstellwert konstant ist, kann der Wert zum Zeitpunkt der Speicherung ermittelt werden. Wenn Sie einen TIMESTAMP-Wert speichern, sollten Sie die Zeitzone ändern und dann den Wert abrufen, da er sich von dem von Ihnen gespeicherten Wert unterscheidet. Dies liegt daran, dass bei der Konvertierung in beide Richtungen nicht dieselbe Zeitzone verwendet wird. Die aktuelle Zeitzone kann als Wert der Systemvariablen time_zone verwendet werden.
Sie können das NULL-Attribut in die Definition einer TIMESTAMP-Spalte aufnehmen, damit die Spalte NULL-Werte enthalten kann. Zum Beispiel:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
如果未指定NULL属性,将列设置为NULL设置则会将它设置为当前的时间戳。请注意允许NULL值的TIMESTAMP列不会采用当前的时间戳,除非要么其 默认值定义为CURRENT_TIMESTAMP,或者NOW()或CURRENT_TIMESTAMP被插入到该列内。换句话说,只有使用如下定义创建,定义为 NULL的TIMESTAMP列才会自动更新:
CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);
否则-也就是说,如果使用NULL而不是DEFAULT TIMESTAMP来定义TIMESTAMP列,如下所示...
CREATE TABLE t1 (ts NULL DEFAULT NULL); CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...则必须显式插入一个对应当前日期和时间的值。例如:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
2. TIME类型
MySQL以'HH:MM:SS'格式检索和显示TIME值(或对于大的小时值采用'HHH:MM:SS'格式)。TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。
你可以用各种格式指定TIME值:
· 'D HH:MM:SS.fraction'格式的字符串。还可以使用下面任何一种“非严格”语法:'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH'或'SS'。这里D表示日,可以取0到34之间的值。请注意MySQL还不保存分数。
· 'HHMMSS'格式的没有间割符的字符串,假定是有意义的时间。例如,'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分),将变为'00:00:00'。
· HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为'10:11:12'。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。请注意MySQL还不保存分数。
· 函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。
对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。'8:3:2'与'08:03:02'相同。
为TIME列分配简写值时应注意。没有冒号,MySQL解释值时假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为'1112'和1112表示'11:12:00'(11点过12分),但MySQL将它们解释为'00:11:12'(11分,12 秒)。同样,'12'和12 被解释为 '00:00:12'。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,'11:12'表示'11:12:00',而不是'00:11:12'。
超出TIME范围但合法的值被裁为范围最接近的端点。例如,'-850:00:00'和'850:00:00'被转换为'-838:59:59'和'838:59:59'。
无效TIME值被转换为'00:00:00'。请注意由于'00:00:00'本身是一个合法TIME值,只从表内保存的一个'00:00:00'值还不能说出原来的值是 '00:00:00'还是不合法的值。
3. YEAR类型
YEAR类型是一个单字节类型用于表示年。
MySQL以YYYY格式检索和显示YEAR值。范围是1901到2155。
可以指定各种格式的YEAR值:
· 四位字符串,范围为'1901'到'2155'。
· 四位数字,范围为1901到2155。
· 两位字符串,范围为'00'到'99'。'00'到'69'和'70'到'99'范围的值被转换为2000到2069和1970到1999范围的YEAR值。
· 两位整数,范围为1到99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为2000。你必须将它指定为一个字符串'0'或'00'或它被解释为0000。
· 函数返回的结果,其值适合YEAR上下文,例如NOW()。
非法YEAR值被转换为0000。
4. Y2K事宜和日期类型
MySQL本身对于2000年(Y2K)是安全的,但输入给MySQL的值可能不安全。任何包含两位年值的输入都会令人模糊,因为世纪不知道。这些值必须解释为四位形式,因为MySQL内部使用四位来保存年。
对于DATETIME、DATE、TIMESTAMP和YEAR类型,MySQL使用以下规则解释含模糊年值的日期:
· 00-69范围的年值转换为2000-2069。
· 70-99范围的年值转换为1970-1999。
请记住这些规则只是合理猜测数据值表示什么。如果MySQL使用的启发不能产生正确的值,你应提供包含四位年值的确切输入。
ORDER BY可以正确排序有两位年的TIMESTAMP或YEAR值。
Einige Funktionen wie MIN() und MAX() konvertieren TIMESTAMP oder YEAR in eine Zahl. Dies bedeutet, dass diese Funktionen bei Werten mit zweistelligen Jahresangaben nicht korrekt funktionieren. Die Lösung besteht in diesem Fall darin, TIMESTAMP oder YEAR in ein vierstelliges Jahresformat zu konvertieren oder MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS)) zu verwenden.