Datums- und Zeit-Funktionen
Eine Beschreibung des Wertebereichs aller Typen und der gültigen Formate für Datums- und Zeitwerte finden Sie unter Date and time types.
Hier ist ein Beispiel, das Datums-Funktionen benutzt. Die unten stehende Anfrage wählt alle Datensätze mit einem datum_spalte-Wert innerhalb der letzten 30 Tage aus:
mysql> SELECT etwas FROM tabelle
WHERE TO_DAYS(NOW()) - TO_DAYS(datum_spalte) <= 30;
DAYOFWEEK(datum)
Gibt den Wochentag-Index zurück.
Für datum gilt: 1 = Sonntag, 2 = Montag, ... 7 = Samstag). Diese Index-Werte entsprechen dem ODBC-Standard:
mysql> select DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(datum)
Gibt den Wochentag-Index für datum zurück (0 = Montag, 1 = Dienstag, ... 6 = Sonntag):
mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5
mysql> select WEEKDAY('1997-11-05');
-> 2
DAYOFMONTH(datum)
Gibt den Tag des Monats für datum im Bereich 1 bis 31 zurück:
mysql> select DAYOFMONTH('1998-02-03');
-> 3
DAYOFYEAR(datum)
Gibt den Tag des Jahres für datum im Bereich 1 bis 366 zurück:
mysql> select DAYOFYEAR('1998-02-03');
-> 34
MONTH(datum)
Gibt den Monat für datum im Bereich 1 bis 12 zurück:
mysql> select MONTH('1998-02-03');
-> 2
DAYNAME(datum)
Gibt den Namen des Wochentags für datum zurück (auf englisch):
mysql> select DAYNAME("1998-02-05");
-> 'Thursday'
MONTHNAME(datum)
Gibt den Namen des Monats für datum zurück (auf englisch):
mysql> select MONTHNAME("1998-02-05");
-> 'February'
QUARTER(datum)
Gibt das Quartal des Jahres für datum im Bereich 1 bis 4 zurück:
mysql> select QUARTER('98-04-01');
-> 2
WEEK(datum)
WEEK(datum,erste)
Mit einem einzelnen Argument gibt diese Funktion die Woche für datum im Bereich 0 bis 53 zurück (ja, es kann Anfänge der Woche 53 geben), für Orte, in denen Sonntag der erste Wochentag ist. In der Form mit zwei Argumenten gestattet WEEK() es, festzulegen, ob die Woche am Sonntag oder am Montag beginnt. Die Woche beginnt am Sonntag, wenn das zweite Argument 0 ist, und am Montag, wenn das zweite Argument 1 ist:
mysql> select WEEK('1998-02-20');
-> 7
mysql> select WEEK('1998-02-20',0);
-> 7
mysql> select WEEK('1998-02-20',1);
-> 8
mysql> select WEEK('1998-12-31',1);
-> 53
YEAR(datum)
Gibt das Jahr für datum im Bereich 1000 bis 9999 zurück:
mysql> select YEAR('98-02-03');
-> 1998
YEARWEEK(datum)
YEARWEEK(datum,erste)
Gibt Jahr und Woche für ein Datum zurück. Das zweite Argument funktioniert genau wie das zweite Argument von WEEK(). Beachten Sie, dass das Jahr sich in der ersten und letzten Woche des Jahres vom Jahr im Datums-Argument unterscheiden kann:
mysql> select YEARWEEK('1987-01-01');
-> 198653
HOUR(zeit)
Gibt die Stunde für zeit im Bereich 0 bis 23 zurück:
mysql> select HOUR('10:05:03');
-> 10
MINUTE(zeit)
Gibt die Minute für zeit im Bereich 0 bis 59 zurück:
mysql> select MINUTE('98-02-03 10:05:03');
-> 5
SECOND(zeit)
Gibt die Sekunde für zeit im Bereich 0 bis 59 zurück:
mysql> select SECOND('10:05:03');
-> 3
PERIOD_ADD(P,N)
Zählt N Monate zur Periode P hinzu (im Format YYMM oder YYYYMM). Gibt einen Wert im Format YYYYMM zurück.
Beachten Sie, dass das Perioden-Argument P kein Datums-Wert ist:
mysql> select PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
Gibt die Anzahl von Monaten zwischen den Perioden P1 und P2 zurück. P1 und P2 sollten im Format YYMM oder YYYYMM sein.
Beachten Sie, dass die Perioden-Argumente P1 und P2 keine Datumswerte sind:
mysql> select PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(datum,INTERVAL ausdruck typ)
DATE_SUB(datum,INTERVAL ausdruck typ)
ADDDATE(datum,INTERVAL ausdruck typ)
SUBDATE(datum,INTERVAL ausdruck typ)
Diese Funktionen führen Datumsberechnungen durch. Sie wurden in MySQL-Version 3.22 eingeführt. ADDDATE() und SUBDATE() sind Synonyme für DATE_ADD() und DATE_SUB().
In MySQL-Version 3.23 können Sie + und - anstelle von DATE_ADD() und DATE_SUB() benutzen, wenn der Ausdruck auf der rechten Seite eine DATE oder DATETIME-Spalte ist (siehe Beispiel).
datum ist ein DATETIME- oder DATE-Wert, der das Anfangsdatum festlegt. ausdruck ist ein Ausdruck, der den Intervallwert festlegt, der zum Anfangsdatum hinzugezählt oder von diesem abgezogen wird. ausdruck ist eine Zeichenkette; sie kann mit einem - für negative Intervalle beginnen. typ ist ein Schlüsselwort, das angibt, wie der Ausdruck interpretiert werden soll.
Die verwandte Funktion EXTRACT(typ FROM datum) gibt das 'typ'-Intervall des Datums zurück.
Folgende Tabelle zeigt, in welchem Zusammenhang die typ- und ausdruck-Argumente stehen:
typ wert erwartet ausdruck format
SECOND Sekunden
MINUTE Minuten
HOUR Stunden
DAY Tage
MONTH Monate
YEAR Jahre
MINUTE_SECOND "Minuten:Sekunden"
HOUR_MINUTE "Stunden:Minuten"
DAY_HOUR "Tage Stunden"
YEAR_MONTH "Jahre-Monate"
HOUR_SECOND "Stunden:Minuten:Sekunden"
DAY_MINUTE "Tage Stunden:Minuten"
DAY_SECOND "Tage Stunden:Minuten:Sekunden"
MySQL erlaubt beliebige Satzzeichen-Begrenzer im ausdruck-Format. Die in der Tabelle gezeigten Begrenzer sind Vorschläge. Wenn das datum-Argument ein DATE-Wert ist und Ihre Berechnungen nur YEAR, MONTH und DAY-Anteile beinhalten (also keine Zeit-Anteile), ist das Ergebnis ein DATE-Wert. Ansonsten ist das Ergebnis ein DATETIME-Wert:
mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
Wenn Sie einen Intervallwert angeben, der zu kurz ist (nicht alle Intervall-Anteile beinhaltet, die vom typ-Schlüsselwort erwartet werden), nimmt MySQL an, dass Sie den äußersten linken Teil des Intervallwerts ausgelassen haben. Wenn Sie beispielsweise einen typ DAY_SECOND angeben, wird vom Wert von ausdruck erwartet, dass dieser Tages-, Stunden-, Minuten- und Sekunden-Anteile enthält. Wenn Sie einen Wert wie "1:10" angeben, nimmt MySQL an, dass die Tages- und Stunden-Anteile fehlen und der Wert Minuten und Sekunden darstellt. Mit anderen Worten wird "1:10" DAY_SECOND so interpretiert, dass es äquivalent zu "1:10" MINUTE_SECOND ist. Das ist analog zur Weise, wie MySQL TIME-Werte interpretiert, die eher vergangene Zeit als Tageszeit darstellen.
Beachten Sie, dass ein Datumswert automatisch in einen DATETIME-Wert umgewandelt wird, wenn Sie einen DATE-Wert zu etwas hinzuzählen oder von etwas abziehen, das einen Zeit-Anteil hat:
mysql> select date_add("1999-01-01", interval 1 day);
-> 1999-01-02
mysql> select date_add("1999-01-01", interval 1 hour);
-> 1999-01-01 01:00:00
Wenn Sie wirklich falsche Datumsangaben benutzen, ist das Ergebnis NULL. Wenn Sie MONTH, YEAR_MONTH oder YEAR hinzuzählen und das Datumsergebnis einen Tag hat, der größer ist als der höchste Tag für den neuen Monat, wird der Tag auf den höchsten Tag des neuen Monats angepasst:
mysql> select DATE_ADD('1998-01-30', Interval 1 month);
-> 1998-02-28
Beachten Sie, dass das Wort INTERVAL und das typ-Schlüsselwort in den vorstehenden Beispielen nicht von der verwendeten Groß-/Kleinschreibung abhängen.
EXTRACT(typ FROM datum)
Die EXTRACT()-Funktion benutzt dieselbe Art von Intervalltyp-Spezifikatoren wie DATE_ADD() oder DATE_SUB(), extrahiert aber Anteile aus dem Datum, statt Datumsberechnungen durchzuführen:
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
TO_DAYS(datum)
Gibt für ein Datum datum eine Tagesanzahl zurück (die Anzahl von Tagen seit dem Jahr 0):
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS('1997-10-07');
-> 729669
TO_DAYS() ist nicht für die Benutzung mit Werten vor der Einführung des Gregorianischen Kalenders (1582) vorgesehen, weil es nicht die Tage berücksichtigt, die verloren gingen, als der Kalender geändert wurde.
FROM_DAYS(N)
Gibt für eine Tagesanzahl N einen DATE-Wert zurück:
mysql> select FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS() ist nicht für die Benutzung mit Werten vor der Einführung des Gregorianischen Kalenders (1582) vorgesehen, weil es nicht die Tage berücksichtigt, die verloren gingen, als der Kalender geändert wurde.
DATE_FORMAT(datum,format)
Formatiert den datum-Wert gemäß der format-Zeichenkette. Folgende Spezifikatoren können in der format-Zeichenkette benutzt werden:
%M Monatsname auf englisch (January bis December)
%W Name des Wochentags auf englisch (Sunday bis Saturday)
%D Tag des Monats mit englischem Suffix (1st, 2nd, 3rd usw.)
%Y Jahr, numerisch, 4 Ziffern
%y Jahr, numerisch, 2 Ziffern
%X Jahr der Woche, wobei Sonntag der erste Tag der Woche ist, numerisch, 4 Ziffern, benutzt mit '%V'
%x Jahr der Woche, wobei Montag der erste Tag der Woche ist, numerisch, 4 Ziffern, benutzt mit '%v'
%a Abgekürzter Name des Wochentags auf englisch (Sun..Sat)
%d Tag des Monats, numerisch (00 bis 31)
%e Tag des Monats, numerisch (0 bis 31)
%m Monat, numerisch (01 bis 12)
%c Monat, numerisch (1 bis 12)
%b Abgekürzter Monatsname auf englisch (Jan bis Dec)
%j Tag des Jahrs (001 bis 366)
%H Stunde (00 bis 23)
%k Stunde (0 bis 23)
%h Stunde (01 bis 12)
%I Stunde (01 bis 12)
%l Stunde (1 bis 12)
%i Minuten, numerisch (00 bis 59)
%r Uhrzeit, 12-Stunden-Format (hh:mm:ss [AP]M)
%T Uhrzeit, 24-Stunden-Format (hh:mm:ss)
%S Sekunden (00 bis 59)
%s Sekunden (00 bis 59)
%p AM oder PM
%w Wochentag (0=Sonntag bis 6=Samstag)
%U Woche (0 bis 53), wobei Sonntag der erste Tag der Woche ist
%u Woche (0 bis 53), wobei Montag der erste Tag der Woche ist
%V Woche (1 bis 53), wobei Sonntag der erste Tag der Woche ist. Benutzt mit '%X'
%v Woche (1 bis 53), wobei Montag der erste Tag der Woche ist. Benutzt mit '%x'
%% Ein Literal %.
Alle anderen Zeichen werden einfach ohne Interpretation ins Ergebnis kopiert:
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W%M%Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D%y%a%d%m%b%j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H%k%I%r%T%S%w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> select DATE_FORMAT('1999-01-01', '%X%V');
-> '1998 52'
Ab MySQL-Version 3.23 ist das %-Zeichen vor Format-Spezifikator-Zeichen erforderlich. In früheren Versionen von MySQL war % optional.
TIME_FORMAT(zeit,format)
Dieses wird benutzt wie die obige DATE_FORMAT()-Funktion, aber die format-Zeichenkette darf nur die Spezifikatoren enthalten, die Stunden, Minuten und Sekunden handhaben. Andere Spezifikatoren erzeugen einen NULL-Wert oder 0.
CURDATE()
CURRENT_DATE
Gibt das Datum von heute im 'YYYY-MM-DD'- oder YYYYMMDD-format zurück, abhängig davon, ob die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:
mysql> select CURDATE();
-> '1997-12-15'
mysql> select CURDATE() + 0;
-> 19971215
CURTIME()
CURRENT_TIME
Gibt die aktuelle Zeit als einen Wert im 'HH:MM:SS'- oder HHMMSS-format zurück, abhängig davon, ob die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
Gibt das aktuelle Datum und die aktuelle Zeit als einen Wert im 'YYYY-MM-DD HH:MM:SS'- oder YYYYMMDDHHMMSS-Format zurück, abhängig davon, ob die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:
mysql> select NOW();
-> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
-> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(datum)
Ohne Argument aufgerufen gibt die Funktion einen Unix-Zeitstempel zurück (Sekunden seit '1970-01-01 00:00:00' GMT). Wenn UNIX_TIMESTAMP() mit einem datum-Argument aufgerufen wird, gibt sie den Wert des Arguments als Sekunden seit '1970-01-01 00:00:00' GMT zurück. datum kann eine DATE
-Zeichenkette, eine DATETIME-Zeichenkette, ein TIMESTAMP oder eine Zahl im Format YYMMDD oder YYYYMMDD in lokaler Zeit sein:
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
Wenn UNIX_TIMESTAMP auf einer TIMESTAMP-Spalte benutzt wird, erhält die Funktion den Wert direkt, ohne implizite "zeichenkette-zu-unix-zeitstempel"-Umwandlung. Wenn Sie UNIX_TIMESTAMP() einen falschen Wert oder einen Wert ausserhalb des Wertebereichs angeben, gibt sie 0 zurück.
FROM_UNIXTIME(unix_zeitstempel)
Gibt das unix_timestamp-Argument als Wert im 'YYYY-MM-DD HH:MM:SS'- oder YYYYMMDDHHMMSS-Format zurück, abhängig davon, ob die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:
mysql> select FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
FROM_UNIXTIME(unix_zeitstempel,format)
Gibt das unix_timestamp-Argument als Wert zurück, der wie mit der format-Zeichenkette angegeben formatiert ist. format kann dieselben Spezifikatoren wie die DATE_FORMAT()-Funktion enthalten:
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y%D%M%h:%i:%s%x');
-> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(sekunden)
Gibt das sekunden-Argument, umgewandelt in Stunden, Minuten und Sekunden, als Wert im 'HH:MM:SS'- oder HHMMSS-Format zurück, abhängig davon, ob die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:
mysql> select SEC_TO_TIME(2378);
-> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(zeit)
Gibt das zeit-Argument, umgewandelt in Sekunden, zurück:
mysql> select TIME_TO_SEC('22:23:00');
-> 80580
mysql> select TIME_TO_SEC('00:39:38');
-> 2378
MySQL-Referenzhandbuch (C) 2002 MySQL AB