Dieser Abschnitt beschreibt die Funktionen, die zur Manipulation von zeitbezogenen Werten verwendet werden können. Eine Beschreibung der Wertebereiche für Datums- und Uhrzeittypen und der gültigen Formate, in denen Werte angegeben werden können, finden Sie in Abschnitt 11.3, „Datums- und Zeittypen“.
Es folgt ein Beispiel, welches Datumsfunktionen verwendet. Die
folgende Abfrage wählt alle Datensätze aus, die einen
date_col
-Wert haben, der in den letzten
30 Tagen liegt:
mysql>SELECT
->something
FROMtbl_name
WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <=
date_col
;
Beachten Sie, dass die Abfrage auch Datensätze mit Daten auswählt, die in der Zukunft liegen.
Funktionen, die Datumswerte erwarten, akzeptieren normalerweise
auch DATETIME
-Werte und ignorieren dabei den
Uhrzeitbestandteil. Ähnlich akzeptieren Funktionen, die Zeitwerte
erwarten, normalerweise auch DATETIME
-Werte und
ignorieren den Datumsbestandteil.
Funktionen, die das aktuelle Datum oder die Uhrzeit zurückgeben,
werden nur einmal pro Abfrage ausgewertet, nämlich beim Start der
Abfrageausführung. Das bedeutet, dass mehrere Referenzierungen
einer Funktion wie NOW()
in einer Abfrage immer
zum selben Ergebnis führen (für unsere Zwecke enthält eine
einzelne Abfrage auch einen Aufruf einer gespeicherten Routine
oder eines Triggers sowie alle Subroutinen, die von dieser Routine
oder diesem Trigger aufgerufen werden). Dieses Prinzip gilt auch
für CURDATE()
, CURTIME()
,
UTC_DATE()
, UTC_TIME()
,
UTC_TIMESTAMP()
und für alle zugehörigen
Synonyme.
Die Funktionen CURRENT_TIMESTAMP()
,
CURRENT_TIME()
,
CURRENT_DATE()
und
FROM_UNIXTIME()
geben Werte in der aktuellen
Zeitzone der Verbindung zurück, die als Wert der Systemvariablen
time_zone
verfügbar ist. Ferner setzt
UNIX_TIMESTAMP()
voraus, dass sein Argument ein
DATETIME
-Wert in der aktuellen Zeitzone ist.
Siehe auch Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“.
Einige Datumsfunktionen können mit „Nulldaten“ oder
unvollständigen Daten wie '2001-11-00'
verwendet werden, während dies bei anderen nicht möglich ist.
Funktionen, die Teile von Datumsangaben extrahieren, arbeiten
meist auch mit unvollständigen Daten. Zum Beispiel:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
-> 0, 0
Andere Funktionen erwarten vollständige Daten und geben
NULL
zurück, wenn unvollständige Daten
übergeben werden. Hierzu gehören Funktionen, die
Datumsberechnungen durchführen oder Teile von Datumsangaben Namen
zuordnen. Zum Beispiel:
mysql>SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
-> NULL mysql>SELECT DAYNAME('2006-05-00');
-> NULL
ADDDATE(
,
date
,INTERVAL
expr
type
)ADDDATE(
expr
,days
)
Wenn mit der Form INTERVAL
für das zweite
Argument aufgerufen, ist ADDDATE()
ein
Synonym von DATE_ADD()
. Die zugehörige
Funktion SUBDATE()
ist ein Synonym für
DATE_SUB()
. Weitere Informationen zum
Argument INTERVAL
finden Sie in der
Beschreibung zu DATE_ADD()
.
mysql>SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02' mysql>SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02'
Wenn mit der Form days
für das
zweite Argument aufgerufen, wird es von MySQL als ganzzahlige
Anzahl von Tagen behandelt, die
expr
hinzugefügt wird.
mysql> SELECT ADDDATE('1998-01-02', 31);
-> '1998-02-02'
ADDTIME()
fügt
expr2
expr
hinzu und gibt das Ergebnis
zurück. expr
ist eine Zeitangabe
oder ein DATETIME
-Wert,
expr2
eine Zeitangabe.
mysql>SELECT ADDTIME('1997-12-31 23:59:59.999999',
->'1 1:1:1.000002');
-> '1998-01-02 01:01:01.000001' mysql>SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
-> '03:00:01.999997'
CONVERT_TZ()
wandelt einen
DATETIME
-Wert dt
von der angegebenen Ausgangszeitzone
from_tz
in die Zielzeitzone
to_tz
um und gibt das Ergebnis
zurück. Zeitzonen werden wie in
Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“, beschrieben angegeben.
Die Funktion gibt NULL
zurück, wenn die
Argumente ungültig sind.
Fiele der Wert durch die Konvertierung aus
from_tz
in UTC außerhalb des vom
Typ TIMESTAMP
unterstützten Bereichs, dann
erfolgt keine Konvertierung. Der für
TIMESTAMP
gültige Bereich ist in
Abschnitt 11.1.2, „Überblick über Datums- und Zeittypen“, beschrieben.
mysql>SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
-> '2004-01-01 13:00:00' mysql>SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
-> '2004-01-01 22:00:00'
Hinweis: Wenn Sie benannte
Zeitzonen wie 'MET'
oder
'Europe/Moscow'
verwenden wollen, müssen
die Zeitzonentabellen korrekt konfiguriert sein. Eine
Anleitung finden Sie in Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“.
Gibt das aktuelle Datum als Wert in den Formaten
'YYYY-MM-DD'
oder
YYYYMMDD
aus. Das Ausgabeformat hängt
davon ab, ob die Funktion in einem String- oder einem
numerischen Kontext verwendet wird.
mysql>SELECT CURDATE();
-> '1997-12-15' mysql>SELECT CURDATE() + 0;
-> 19971215
CURRENT_DATE
und
CURRENT_DATE()
sind Synonyme von
CURDATE()
.
Gibt die aktuelle Uhrzeit als Wert in den Formaten
'HH:MM:SS'
oder HHMMSS
aus. Das Ausgabeformat hängt davon ab, ob die Funktion in
einem String- oder einem numerischen Kontext verwendet wird.
mysql>SELECT CURTIME();
-> '23:50:26' mysql>SELECT CURTIME() + 0;
-> 235026
CURRENT_TIME
und
CURRENT_TIME()
sind Synonyme von
CURTIME()
.
CURRENT_TIMESTAMP
,
CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP
und
CURRENT_TIMESTAMP()
sind Synonyme von
NOW()
.
Extrahiert den Datumsteil aus dem DATE
-
oder DATETIME
-Ausdruck
expr
.
mysql> SELECT DATE('2003-12-31 01:02:03');
-> '2003-12-31'
DATEDIFF()
gibt die Anzahl der Tage
zwischen dem Startdatum expr
und
dem Enddatum expr2
zurück.
expr
und
expr2
sind DATE
-
oder DATETIME
-Ausdrücke. Nur die
Datumsanteile der Werte werden in der Berechnung verwendet.
mysql>SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1 mysql>SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
-> -31
DATE_ADD(
,
date
,INTERVAL
expr
type
)DATE_SUB(
date
,INTERVAL
expr
type
)
Diese Funktionen führen Datumsberechnungen durch.
date
ist ein
DATETIME
- oder
DATE
-Wert, der das Startdatum angibt.
expr
ist ein Ausdruck, der den vom
Startdatum hinzuzufügenden oder abzuziehenden Intervallwert
angibt. expr
ist dabei ein String
und kann bei negativen Intervallen mit einem
‘-
’ beginnen.
type
ist ein Schlüsselwort, das
angibt, wie der Ausdruck zu interpretieren ist.
Das Schlüsselwort INTERVAL
und die Angabe
type
unterscheiden die
Groß-/Kleinschreibung nicht.
Die folgende Tabelle zeigt die erwartete Form des Arguments
expr
für die einzelnen
type
-Werte.
type Wert
|
Erwartetes
expr -Format
|
MICROSECOND |
MICROSECONDS |
SECOND |
SECONDS |
MINUTE |
MINUTES |
HOUR |
HOURS |
DAY |
DAYS |
WEEK |
WEEKS |
MONTH |
MONTHS |
QUARTER |
QUARTERS |
YEAR |
YEARS |
SECOND_MICROSECOND |
'SECONDS.MICROSECONDS' |
MINUTE_MICROSECOND |
'MINUTES.MICROSECONDS' |
MINUTE_SECOND |
'MINUTES:SECONDS' |
HOUR_MICROSECOND |
'HOURS.MICROSECONDS' |
HOUR_SECOND |
'HOURS:MINUTES:SECONDS' |
HOUR_MINUTE |
'HOURS:MINUTES' |
DAY_MICROSECOND |
'DAYS.MICROSECONDS' |
DAY_SECOND |
'DAYS HOURS:MINUTES:SECONDS' |
DAY_MINUTE |
'DAYS HOURS:MINUTES' |
DAY_HOUR |
'DAYS HOURS' |
YEAR_MONTH |
'YEARS-MONTHS' |
MySQL erlaubt die Verwendung beliebiger Interpunktionszeichen
als Trennzeichen im Format von
expr
. Die in der Tabelle gezeigten
Trennzeichen sind als Vorschläge aufzufassen. Wenn das
Argument date
ein
DATE
-Wert ist und Ihre Berechnungen nur die
Teile YEAR
, MONTH
und
DAY
(also keine uhrzeitbezogenen Teile)
betreffen, ist das Ergebnis ein DATE
-Wert.
Andernfalls ist das Ergebnis ein
DATETIME
-Wert.
Datumsberechnungen können auch mit
INTERVAL
in Kombination mit den Operatoren
+
und -
durchgeführt
werden:
date
+ INTERVALexpr
type
date
- INTERVALexpr
type
INTERVAL
ist auf beiden
Seiten des Operators expr
type
+
zulässig, wenn der
Ausdruck auf der jeweils anderen Seite ein
DATE
- oder DATETIME
-Wert
ist. Beim Operator -
ist INTERVAL
nur auf der rechten
Seite der Gleichung zulässig, da das Abziehen eines
expr
type
DATE
- oder
DATETIME
-Werts von einem Intervall unsinnig
wäre.
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' mysql>SELECT DATE_ADD('1992-12-31 23:59:59.000002',
->INTERVAL '1.999999' SECOND_MICROSECOND);
-> '1993-01-01 00:00:01.000001'
Wenn Sie einen Intervallwert angeben, der zu kurz ist (d. h.
nicht alle Intervallteile enthält, die aufgrund des
Schlüsselworts type
erwartet
werden), dann geht MySQL davon aus, dass Sie den linken Teil
des Intervallwerts weggelassen haben. Geben Sie also etwa als
type
DAY_SECOND
an, dann
wird erwartet, dass der Wert von
expr
Teile für Tage, Stunden,
Minuten und Sekunden enthält. Bei einer Angabe
'1:10'
setzt MySQL voraus, dass die Teile
für Tage und Stunden fehlen und der Wert Minuten und Sekunden
angibt. Anders gesagt, wird '1:10'
DAY_SECOND
als äquivalent zu '1:10'
MINUTE_SECOND
interpretiert. Dies entspricht auch
der Art und Weise, wie MySQL TIME
-Werte als
verstrichene Zeit (statt als Uhrzeit) auffasst.
Wenn Sie etwas zu einem Datum hinzuaddieren oder davon
abziehen, das einen Uhrzeitteil enthält, dann wird das
Ergebnis automatisch in einen DATETIME
-Wert
umgewandelt:
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 MONTH
,
YEAR_MONTH
oder YEAR
hinzuaddieren und das Ergebnis einen Tageswert hat, der
größer ist als der letzte Tag des neuen Monats, dann wird
der Tag im neuen Monat auf den letzten Tag gesetzt:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-02-28'
Datumsberechnungen erfordern vollständige Datumsangaben;
unvollständige Angaben wie '2005-07-00'
oder erheblich fehlerhaft formatierte Werte wie die folgenden
funktionieren nicht:
mysql>SELECT DATE_ADD('2006-07-00', INTERVAL 1 DAY);
-> NULL mysql>SELECT '2005-03-32' + INTERVAL 1 MONTH;
-> NULL
Formatiert den Wert date
entsprechend dem String format
.
Die folgenden Konfigurationsangaben können im String
format
verwendet werden. Das
Zeichen ‘%
’ ist vor jede
Formatangabe zu setzen.
Konfigurationsangabe | Beschreibung |
%a |
Abgekürzter Name des Wochentags (Sun ...
Sat ) |
%b |
Abgekürzter Name des Monats (Jan ...
Dec ) |
%c |
Monat, numerisch (0 ... 12 ) |
%D |
Tag im Monat mit englischem Suffix (0th ,
1st , 2nd ,
3rd , …) |
%d |
Tag im Monat, numerisch (00 ...
31 ) |
%e |
Tag im Monat, numerisch (0 ... 31 ) |
%f |
Mikrosekunden (000000 ... 999999 ) |
%H |
Stunde (00 ... 23 ) |
%h |
Stunde (01 ... 12 ) |
%I |
Stunde (01 ... 12 ) |
%i |
Minuten, numerisch (00 ... 59 ) |
%j |
Tag im Jahr (001 ... 366 ) |
%k |
Stunde (0 ... 23 ) |
%l |
Stunde (1 ... 12 ) |
%M |
Monatsname (January ... December ) |
%m |
Monat, numerisch (00 ... 12 ) |
%p |
AM oder PM
|
%r |
Uhrzeit im 12-Stunden-Format (hh:mm:ss gefolgt von
AM oder PM ) |
%S |
Sekunden (00 ... 59 ) |
%s |
Sekunden (00 ... 59 ) |
%T |
Uhrzeit im 24-Stunden-Format (hh:mm:ss ) |
%U |
Woche (00 ... 53 ), wobei Sonntag
der erste Tag der Woche ist |
%u |
Woche (00 ... 53 ), wobei Montag
der erste Tag der Woche ist |
%V |
Woche (01 ... 53 ), wobei Sonntag
der erste Tag der Woche ist; wird mit
%X verwendet |
%v |
Woche (01 ... 53 ), wobei Montag
der erste Tag der Woche ist; wird mit
%x verwendet |
%W |
Name des Wochentags (Sunday ...
Saturday ) |
%w |
Tag in der Woche (0 =Sonntag ...
6 =Sonnabend) |
%X |
Jahr der Woche, wobei Sonntag der erste Tag der Woche ist, numerisch,
vierstellig; wird mit %V verwendet |
%x |
Jahr der Woche, wobei Montag der erste Tag der Woche ist, numerisch,
vierstellig; wird mit %v verwendet |
%Y |
Jahr, numerisch, vierstellig |
%y |
Jahr, numerisch, zweistellig |
%% |
Literales ‘% ’-Zeichen |
% |
x , steht für jedes nicht oben aufgeführte
‘x ’ |
Da MySQL die Speicherung unvollständiger Daten wie
'2004-00-00'
gestattet, beginnen die
Bereiche für die monats- und tagesbezogenen
Konfigurationsangaben bei null.
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' mysql>SELECT DATE_FORMAT('2006-06-00', '%d');
-> '00'
DAY()
ist ein Synonym für
DAYOFMONTH()
.
Gibt den Namen des Wochentags für
date
zurück.
mysql> SELECT DAYNAME('1998-02-05');
-> 'Thursday'
Gibt den Tag im Monat für date
zurück. Der Bereich liegt zwischen 0
und
31
.
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
Gibt den Wochentagindex für date
zurück (1
= Sonntag, 2
= Montag, …, 7
= Sonnabend). Diese
Indexwerte entsprechen dem ODBC-Standard.
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
Gibt den Tag im Jahr für date
zurück. Der Bereich liegt zwischen 1
und
366
.
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
Die Funktion EXTRACT()
verwendet dieselben
Angaben für den Intervalltyp wie
DATE_ADD()
oder
DATE_SUB()
, extrahiert aber Teile des
Datums, statt daran Berechnungen 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 mysql>SELECT EXTRACT(MICROSECOND
->FROM '2003-01-02 10:30:00.000123');
-> 123
Gibt für eine Tagesanzahl N
den
DATE
-Wert zurück.
mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
Verwenden Sie FROM_DAYS()
bei alten
Datumsangaben mit Vorsicht. Die Funktion ist nicht zur
Verwendung mit Daten gedacht, die vor der Einführung des
gregorianischen Kalenders (1582) liegen. Siehe auch
Abschnitt 12.6, „Welchen Kalender benutzt MySQL?“.
FROM_UNIXTIME(
,
unix_timestamp
)FROM_UNIXTIME(
unix_timestamp
,format
)
Gibt eine Darstellung des
unix_timestamp
-Arguments als Wert
in den Formaten 'YYYY-MM-DD HH:MM:SS'
oder
YYYYMMDDHHMMSS
zurück. Das Ausgabeformat
hängt davon ab, ob die Funktion in einem String- oder einem
numerischen Kontext verwendet wird.
unix_timestamp
ist ein interner
Zeitstempelwert, der von der Funktion
UNIX_TIMESTAMP()
erzeugt wird.
Wenn format
angegeben ist, wird das
Ergebnis entsprechend dem String
format
formatiert, der so verwendet
wird wie im Abschnitt zur Funktion
DATE_FORMAT()
beschrieben.
mysql>SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00' mysql>SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300 mysql>SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
->'%Y %D %M %h:%i:%s %x');
-> '2003 6th August 06:22:58 2003'
Hinweis: Wenn Sie UNIX_TIMESTAMP()
und
FROM_UNIXTIME()
zur Konvertierung zwischen
TIMESTAMP
-Werten und Unix-Zeitstempelwerten
verwenden, ist die Konvertierung verlustbehaftet, weil die
Zuordnung nicht in beiden Richtungen 1 : 1 erfolgt. Weitere
Informationen entnehmen Sie der Beschreibung der Funktion
UNIX_TIMESTAMP()
.
GET_FORMAT(DATE|TIME|DATETIME,
'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')
Gibt einen Format-String zurück. Diese Funktion ist praktisch
in Verbindung mit den Funktionen
DATE_FORMAT()
und
STR_TO_DATE()
.
Die zulässigen Werte für das erste und zweite Argument
ergeben verschiedene Möglichkeiten für Format-Strings. (Die
Konfigurationsangaben entnehmen Sie der Tabelle in der
Beschreibung zu DATE_FORMAT()
.) Das
ISO-Format verweist auf ISO 9075, nicht auf ISO 8601.
Funktionsaufruf | Ergebnis |
GET_FORMAT(DATE,'USA') |
'%m.%d.%Y' |
GET_FORMAT(DATE,'JIS') |
'%Y-%m-%d' |
GET_FORMAT(DATE,'ISO') |
'%Y-%m-%d' |
GET_FORMAT(DATE,'EUR') |
'%d.%m.%Y' |
GET_FORMAT(DATE,'INTERNAL') |
'%Y%m%d' |
GET_FORMAT(DATETIME,'USA') |
'%Y-%m-%d-%H.%i.%s' |
GET_FORMAT(DATETIME,'JIS') |
'%Y-%m-%d %H:%i:%s' |
GET_FORMAT(DATETIME,'ISO') |
'%Y-%m-%d %H:%i:%s' |
GET_FORMAT(DATETIME,'EUR') |
'%Y-%m-%d-%H.%i.%s' |
GET_FORMAT(DATETIME,'INTERNAL') |
'%Y%m%d%H%i%s' |
GET_FORMAT(TIME,'USA') |
'%h:%i:%s %p' |
GET_FORMAT(TIME,'JIS') |
'%H:%i:%s' |
GET_FORMAT(TIME,'ISO') |
'%H:%i:%s' |
GET_FORMAT(TIME,'EUR') |
'%H.%i.%S' |
GET_FORMAT(TIME,'INTERNAL') |
'%H%i%s' |
TIMESTAMP
kann auch als erstes Argument
für GET_FORMAT()
verwendet werden. In
diesem Fall gibt die Funktion dieselben Werte wie bei
DATETIME
zurück.
mysql>SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
-> '03.10.2003' mysql>SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
-> '2003-10-31'
Gibt die Stundenangabe in time
zurück. Der Bereich des Rückgabewerts liegt zwischen
0
und 23
bei
Tageszeitwerten. Allerdings ist der zulässige Bereich für
TIME
wesentlich größer, d. h.,
HOUR
kann Werte zurückgeben, die größer
als 23
sind.
mysql>SELECT HOUR('10:05:03');
-> 10 mysql>SELECT HOUR('272:59:59');
-> 272
Nimmt einen DATE
- oder
DATETIME
-Wert entgegen und gibt den
entsprechenden Wert des letzten Tages des betreffenden Monats
zurück. Gibt NULL
zurück, wenn das
Argument unzulässig ist.
mysql>SELECT LAST_DAY('2003-02-05');
-> '2003-02-28' mysql>SELECT LAST_DAY('2004-02-05');
-> '2004-02-29' mysql>SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31' mysql>SELECT LAST_DAY('2003-03-32');
-> NULL
LOCALTIME
und
LOCALTIME()
sind Synonyme von
NOW()
.
LOCALTIMESTAMP
,
LOCALTIMESTAMP()
LOCALTIMESTAMP
und
LOCALTIMESTAMP()
sind Synonyme von
NOW()
.
Gibt ein Datum zurück, welches auf den übergebenen Werten
für das Jahr und den Tag im Jahr basiert.
dayofyear
muss größer als 0 sein,
andernfalls ist das Ergebnis NULL
.
mysql>SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
-> '2001-01-31', '2001-02-01' mysql>SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
-> '2001-12-31', '2004-12-30' mysql>SELECT MAKEDATE(2001,0);
-> NULL
Gibt einen Zeitwert zurück, der aus den Argumenten
hour
,
minute
und
second
berechnet wird.
mysql> SELECT MAKETIME(12,15,30);
-> '12:15:30'
Gibt die Anzahl der Mikrosekunden für den übergebenen
TIME
- oder
DATETIME
-Ausdruck
expr
als Zahl im Bereich zwischen
0
und 999999
zurück.
mysql>SELECT MICROSECOND('12:00:00.123456');
-> 123456 mysql>SELECT MICROSECOND('1997-12-31 23:59:59.000010');
-> 10
Gibt die Minute für time
im
Bereich zwischen 0
und
59
zurück.
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
Gibt den Monat für date
im Bereich
zwischen 0
und 12
zurück.
mysql> SELECT MONTH('1998-02-03');
-> 2
Gibt den vollständigen Namen des Monats für
date
zurück.
mysql> SELECT MONTHNAME('1998-02-05');
-> 'February'
Gibt die aktuellen Werte für Datum und Uhrzeit als Wert in
den Formaten YYYYMMDDHHMMSS
oder
'YYYY-MM-DD HH:MM:SS'
aus. Das
Ausgabeformat hängt davon ab, ob die Funktion in einem
String- oder einem numerischen Kontext verwendet wird.
mysql>SELECT NOW();
-> '1997-12-15 23:50:26' mysql>SELECT NOW() + 0;
-> 19971215235026
Aus einer gespeicherten Routine oder einem Trigger heraus gibt
NOW()
einen Zeitpunkt als Konstante
zurück, zu dem die Ausführung der Routine bzw. des Triggers
begann. Hier liegt ein Unterschied zum Verhalten von
SYSDATE()
vor, welches die exakte Zeit
seiner Ausführung zurückgibt.
Fügt N
Monate zum Zeitraum
P
(im Format
YYMM
oder YYYYMM
) hinzu.
Gibt einen Wert im Format YYYYMM
zurück.
Beachten Sie, dass das Zeitraumargument
P
kein
Datumswert ist.
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
Gibt die Anzahl der Monate zwischen den Zeiträumen
P1
und
P2
zurück.
P1
und
P2
sollten im Format
YYMM
oder YYYYMM
übergeben werden. Beachten Sie, dass die Zeitraumargumente
P1
und
P2
keine
Datumswerte sind.
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
Gibt das Quartal im Jahr für date
zurück. Der Bereich liegt zwischen 1
und
4
.
mysql> SELECT QUARTER('98-04-01');
-> 2
Gibt die Sekunde für time
im
Bereich zwischen 0
und
59
zurück.
mysql> SELECT SECOND('10:05:03');
-> 3
Gibt das Argument seconds
,
konvertiert in Stunden, Minuten und Sekunden, als Wert in den
Formaten 'HH:MM:SS'
oder
HHMMSS
aus. Das Ausgabeformat hängt davon
ab, ob die Funktion in einem String- oder einem numerischen
Kontext verwendet wird.
mysql>SELECT SEC_TO_TIME(2378);
-> '00:39:38' mysql>SELECT SEC_TO_TIME(2378) + 0;
-> 3938
Dies ist die Umkehrung der Funktion
DATE_FORMAT()
. Sie nimmt einen String
str
und einen Format-String
format
entgegen.
STR_TO_DATE()
gibt einen
DATETIME
-Wert zurück, wenn der
Format-String sowohl Datums- als auch Uhrzeitteile enthält,
oder einen DATE
-
TIME
-Wert, wenn der String nur Datums- bzw.
Uhrzeitteile umfasst.
Die DATE
-, TIME
- oder
DATETIME
-Werte, die in
str
enthalten sind, sollten in dem
Format angegeben werden, das durch
format
spezifiziert wurde.
Informationen zu den in format
verwendbaren Konfigurationsangaben finden Sie in der
Beschreibung zur Funktion DATE_FORMAT()
.
Wenn str
einen unzulässigen
DATE
-, TIME
- oder
DATETIME
-Wert enthält, gibt
STR_TO_DATE()
NULL
zurück. Außerdem erzeugt ein unzulässiger Wert eine
Warnung.
Die Bereichsprüfung der Teile von Datumswerten erfolgt wie in
Abschnitt 11.3.1, „Die DATETIME
-, DATE
- und
TIMESTAMP
-Typen“, beschrieben. Das bedeutet, dass
„Nulldaten“ oder solche, bei denen Bestandteile 0
sind, zulässig sind, sofern dem nicht der aktive SQL-Modus
widerspricht.
mysql>SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
-> '0000-00-00' mysql>SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
-> '2004-04-31'
SUBDATE(
,
date
,INTERVAL
expr
type
)SUBDATE(
expr
,days
)
Wenn mit der Form INTERVAL
für das zweite
Argument aufgerufen wird, ist SUBDATE()
ein
Synonym von DATE_SUB()
. Weitere
Informationen zum Argument INTERVAL
finden
Sie in der Beschreibung zu DATE_ADD()
.
mysql>SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02' mysql>SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
Die zweite Form gestattet die Verwendung eines Integer-Werts
für days
. In solchen Fällen wird
der Wert als Anzahl von Tagen interpretiert, die vom
DATE
- oder
DATETIME
-Ausdruck
expr
abgezogen werden.
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
-> '1997-12-02 12:00:00'
Hinweis: Sie können mit dem
Format "%X%V"
keine Konvertierung eines aus
einer Jahres- und einer Wochenangabe bestehenden Strings in
ein Datum durchführen, weil diese Kombination nicht eindeutig
ein Jahr und einen Monat bezeichnet, wenn eine Woche eine
Monatsgrenze überschreitet. Insofern müssen Sie, wenn Sie
eine Jahr-/Wochen-Kombination in ein Datum umwandeln wollen,
auch den Wochentag angeben:
mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W');
-> '2004-10-18'
SUBTIME()
zieht
expr2
von
expr
ab und gibt das Ergebnis
zurück. expr
ist eine
Uhrzeitangabe oder ein DATETIME
-Wert,
expr2
eine Uhrzeitangabe.
mysql>SELECT SUBTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002');
-> '1997-12-30 22:58:58.999997' mysql>SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');
-> '-00:59:59.999999'
Gibt die aktuellen Werte für Datum und Uhrzeit als Wert in
den Formaten YYYYMMDDHHMMSS
oder
'YYYY-MM-DD HH:MM:SS'
aus. Das
Ausgabeformat hängt davon ab, ob die Funktion in einem
String- oder einem numerischen Kontext verwendet wird.
Aus einer gespeicherten Routine oder einem Trigger heraus gibt
SYSDATE()
die Zeit zurück, zu der sie
ausgeführt wird. Dies unterscheidet sich vom Verhalten von
NOW()
, welches die Uhrzeit zurückgibt, zu
der die Ausführung der Routine- oder Trigger-Anweisung
begann.
Extrahiert den Zeitbestandteil des TIME
-
oder DATETIME
-Ausdrucks
expr
und gibt diesen als String
zurück.
mysql>SELECT TIME('2003-12-31 01:02:03');
-> '01:02:03' mysql>SELECT TIME('2003-12-31 01:02:03.000123');
-> '01:02:03.000123'
TIMEDIFF()
gibt den Zeitraum zwischen der
Startzeit expr
und der Endzeit
expr2
zurück.
expr
und
expr2
sind Zeit- oder
DATETIME
-Ausdrücke, müssen aber vom
selben Typ sein.
mysql>SELECT TIMEDIFF('2000:01:01 00:00:00',
->'2000:01:01 00:00:00.000001');
-> '-00:00:00.000001' mysql>SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
->'1997-12-30 01:01:01.000002');
-> '46:58:57.999999'
TIMESTAMP(
,
expr
)TIMESTAMP(
expr
,expr2
)
Bei nur einem Argument gibt diese Funktion den Datums- oder
DATETIME
-Ausdruck
expr
als
DATETIME
-Wert zurück. Bei zwei Argumenten
wird der Zeitausdruck expr2
zum
Datums- oder DATETIME
-Ausdruck
expr
hinzugefügt und das Ergebnis
als DATETIME
-Wert zurückgegeben.
mysql>SELECT TIMESTAMP('2003-12-31');
-> '2003-12-31 00:00:00' mysql>SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
-> '2004-01-01 00:00:00'
TIMESTAMPADD(
interval
,int_expr
,datetime_expr
)
Fügt den Integer-Ausdruck int_expr
zum Datums- oder DATETIME
-Ausdruck
datetime_expr
hinzu. Die Einheit
für int_expr
wird durch das
Argument interval
angegeben, das einen der
folgenden Werte haben sollte: FRAC_SECOND
,
SECOND
, MINUTE
,
HOUR
, DAY
,
WEEK
, MONTH
,
QUARTER
oder YEAR
.
Der interval
-Wert kann mithilfe
eines der angegebenen Schlüsselwörter oder mit dem Präfix
SQL_TSI_
angegeben werden. Beispielsweise
sind sowohl DAY
als auch
SQL_TSI_DAY
zulässig.
mysql>SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
-> '2003-01-02 00:01:00' mysql>SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
-> '2003-01-09'
TIMESTAMPDIFF(
interval
,datetime_expr1
,datetime_expr2
)
Gibt den Unterschied zwischen den Datums- oder
DATETIME
-Ausdrücken
datetime_expr1
und
datetime_expr2
zurück. Die Einheit
für das Ergebnis wird über das Argument
interval
angegeben. Die zulässigen
Werte für interval
entsprechen den
in der Beschreibung zu TIMESTAMPADD()
aufgelisteten Optionen.
mysql>SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
-> 3 mysql>SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
-> -1
Wird wie die Funktion DATE_FORMAT()
verwendet, der String format
darf
aber nur Formatangaben für Stunden, Minuten und Sekunden
enthalten. Andere Konfigurationsangaben erzeugen einen
NULL
-Wert oder 0
.
Wenn der time
-Wert einen
Stundenbestandteil enthält, der größer als
23
ist, erzeugen die Stundenformatangaben
%H
und %k
einen Wert,
der größer ist als der normale Bereich 0 ...
23
. Die übrigen Konfigurationsangaben für das
Stundenformat erzeugen den Stundenwert mod 12.
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
-> '100 100 04 04 4'
Gibt das Argument time
in Sekunden
konvertiert zurück.
mysql>SELECT TIME_TO_SEC('22:23:00');
-> 80580 mysql>SELECT TIME_TO_SEC('00:39:38');
-> 2378
Gibt zu einem Datum date
eine
Anzahl von Tagen zurück. Diese gibt die Anzahl der seit dem
Jahr 0 bis zu diesem Datum verstrichenen Tage zurück.
mysql>SELECT TO_DAYS(950501);
-> 728779 mysql>SELECT TO_DAYS('1997-10-07');
-> 729669
TO_DAYS()
ist nicht für die Verwendung mit
Werten geeignet, die vor der Einführung des gregorianischen
Kalenders (1582) liegen, da die bei der Kalenderumstellung
„verlorenen“ Tage von der Funktion nicht
berücksichtigt werden. Bei Daten vor 1582 (und
standortabhängig möglicherweise auch danach) sind die
Ergebnisse dieser Funktion nicht zuverlässig. Weitere
Informationen finden Sie in Abschnitt 12.6, „Welchen Kalender benutzt MySQL?“.
Denken Sie daran, dass MySQL zweistellige Jahresangaben unter
Verwendung der in Abschnitt 11.3, „Datums- und Zeittypen“,
beschriebenen Regeln in das vierstellige Format umwandelt.
Beispielsweise werden '1997-10-07'
und
'97-10-07'
als identische Daten betrachtet.
mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07');
-> 729669, 729669
UNIX_TIMESTAMP()
,
UNIX_TIMESTAMP(
date
)
Sofern ohne Argument aufgerufen, gibt die Funktion einen
Unix-Zeitstempel (Sekunden seit '1970-01-01
00:00:00'
im UTC-Format) als vorzeichenlosen Integer
zurück. Wenn UNIX_TIMESTAMP()
mit einem
Argument date
aufgerufen wird, gibt
es den Wert des Arguments als seit dem Zeitpunkt
'1970-01-01 00:00:00'
(UTC) verstrichene
Sekunden zurück. date
kann ein
DATE
-String, ein
DATETIME
-String, ein
TIMESTAMP
oder eine Zahl im Format
YYMMDD
oder YYYYMMDD
sein. Der Server interpretiert date
als Wert in der aktuellen Zeitzone und wandelt es in einen
internen Wert in UTC um. Clients können ihre Zeitzone wie in
Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“, beschrieben einstellen.
mysql>SELECT UNIX_TIMESTAMP();
-> 882226357 mysql>SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
Wenn UNIX_TIMESTAMP
für eine
TIMESTAMP
-Spalte verwendet wird, gibt die
Funktion den internen Zeitstempelwert direkt zurück, d. h.
ohne implizite Konvertierung des Strings in einen
Unix-Zeitstempel. Wenn Sie einen Wert außerhalb des
zulässigen Bereichs an UNIX_TIMESTAMP()
übergeben, wird 0
zurückgegeben.
Hinweis: Wenn Sie UNIX_TIMESTAMP()
und
FROM_UNIXTIME()
zur Konvertierung zwischen
TIMESTAMP
-Werten und Unix-Zeitstempelwerten
verwenden, ist die Konvertierung verlustbehaftet, weil die
Zuordnung nicht in beiden Richtungen 1 : 1 erfolgt.
Beispielsweise kann es aufgrund der Konventionen zur Änderung
der lokalen Zeitzone möglich sein, dass zwei
UNIX_TIMESTAMP()
-Funktionen zwei
TIMESTAMP
-Werte in denselben
Unix-Zeitstempelwert umwandeln.
FROM_UNIXTIME()
wiederum konvertiert den
Wert dann in nur einen der ursprünglichen
TIMESTAMP
-Werte zurück. Es folgt ein
Beispiel unter Verwendung von
TIMESTAMP
-Werten in der Zeitzone
CET
(mitteleuropäische Zeit):
mysql>SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
+---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 03:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql>SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
+---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 02:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql>SELECT FROM_UNIXTIME(1111885200);
+---------------------------+ | FROM_UNIXTIME(1111885200) | +---------------------------+ | 2005-03-27 03:00:00 | +---------------------------+
Wenn Sie UNIX_TIMESTAMP()
-Spalten
subtrahieren wollen, sollten Sie das Ergebnis in
vorzeichenbehaftete Integers umwandeln. Siehe auch
Abschnitt 12.8, „Cast-Funktionen und Operatoren“.
Gibt das aktuelle UTC-Datum als Wert in den Formaten
'YYYY-MM-DD'
oder
YYYYMMDD
aus. Das Ausgabeformat hängt
davon ab, ob die Funktion in einem String- oder einem
numerischen Kontext verwendet wird.
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
-> '2003-08-14', 20030814
Gibt die aktuelle UTC-Uhrzeit als Wert in den Formaten
'HH:MM:SS'
oder HHMMSS
aus. Das Ausgabeformat hängt davon ab, ob die Funktion in
einem String- oder einem numerischen Kontext verwendet wird.
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
-> '18:07:53', 180753
UTC_TIMESTAMP
,
UTC_TIMESTAMP()
Gibt die aktuellen UTC-Werte für Datum und Uhrzeit als Wert
in den Formaten YYYYMMDDHHMMSS
oder
'YYYY-MM-DD HH:MM:SS'
aus. Das
Ausgabeformat hängt davon ab, ob die Funktion in einem
String- oder einem numerischen Kontext verwendet wird.
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
-> '2003-08-14 18:08:04', 20030814180804
Diese Funktion gibt die Nummer der Woche für
date
zurück. Wird
WEEK()
mit zwei Argumenten verwendet, dann
gestattet Ihnen die Funktion die Angabe, ob die Woche am
Sonntag oder Montag beginnt und ob der Rückgabewert im
Bereich zwischen 0
und
53
oder 1
und
53
liegen soll. Wird das Argument
mode
weggelassen, so wird der Wert
der Systemvariablen default_week_format
verwendet. Siehe auch
Abschnitt 5.2.2, „Server-Systemvariablen“.
Die folgende Tabelle beschreibt, wie das Argument
mode
funktioniert.
Erster | |||
Modus | Wochentag | Bereich | Woche 1 ist die erste Woche … |
0 | Sonntag | 0–53 | mit einem Sonntag in diesem Jahr |
1 | Montag | 0–53 | mit mehr als drei Tagen innerhalb dieses Jahres |
2 | Sonntag | 1–53 | mit einem Sonntag in diesem Jahr |
3 | Montag | 1–53 | mit mehr als drei Tagen innerhalb dieses Jahres |
4 | Sonntag | 0–53 | mit mehr als drei Tagen innerhalb dieses Jahres |
5 | Montag | 0–53 | mit einem Montag in diesem Jahr |
6 | Sonntag | 1–53 | mit mehr als drei Tagen innerhalb dieses Jahres |
7 | Montag | 1–53 | mit einem Montag in diesem Jahr |
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
Beachten Sie, dass, wenn ein Datum in die letzte Woche des
vorherigen Jahres fällt, MySQL 0
zurückgibt, sofern Sie nicht 2
,
3
, 6
oder
7
als optionales
mode
-Argument angeben:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
Man könnte nun anführen, dass MySQL doch eigentlich
52
für die Funktion
WEEK()
zurückgeben sollte, da das
angegebene Datum eigentlich in der 52. Woche des Jahres 1999
liegt. Wir haben aber beschlossen, stattdessen
0
zurückgeben zu lassen, weil die Funktion
„Nummer der Woche im angegebenen Jahr“
zurückgeben soll. Dies macht die Verwendung der Funktion
WEEK()
zuverlässig, wenn sie mit anderen
Funktionen kombiniert wird, die einen Tagesbestandteil aus dem
Datum extrahieren.
Wenn Sie eine Auswertung des Ergebnisses in Bezug auf das Jahr
vorziehen, das den ersten Tag der Woche des angegebenen Datums
enthält, dann verwenden Sie 0
,
2
, 5
oder
7
als optionales
mode
-Argument.
mysql> SELECT WEEK('2000-01-01',2);
-> 52
Alternativ verwenden Sie die Funktion
YEARWEEK()
:
mysql>SELECT YEARWEEK('2000-01-01');
-> 199952 mysql>SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> '52'
Gibt den Wochentagindex für date
zurück (0
= Montag, 1
=
Dienstag, …, 6
= Sonntag).
mysql>SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1 mysql>SELECT WEEKDAY('1997-11-05');
-> 2
Gibt die Kalenderwoche des Datums als Zahl im Bereich zwischen
1
und 53
zurück.
WEEKOFYEAR()
ist eine
Kompatibilitätsfunktion, die äquivalent zu
WEEK(
ist.
date
,3)
mysql> SELECT WEEKOFYEAR('1998-02-20');
-> 8
Gibt das Jahr für date
im Bereich
zwischen 1000
und 9999
oder aber 0
für das
„Nulldatum“ zurück.
mysql> SELECT YEAR('98-02-03');
-> 1998
YEARWEEK(
,
date
)YEARWEEK(
date
,start
)
Gibt Jahr und Woche für ein Datum zurück. Das Argument
start
funktioniert ganz genauso wie
das Argument start
für
WEEK()
. Das Jahr im Ergebnis kann sich im
Falle der ersten und der letzten Woche des Jahres vom Jahr im
Datumsargument unterscheiden.
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
Beachten Sie, dass die Wochennummer sich von dem, was die
Funktion WEEK()
für ihre optionalen
Argumente 0
oder 1
zurückgäbe (nämlich 0
), unterscheidet,
denn WEEK()
gibt die Woche im Kontext des
angegebenen Jahres zurück.
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.