MySQL 5.1 Referenzhandbuch :: 12 Funktionen für die Benutzung in SELECT- und WHERE-Klauseln :: 12.5 Datums- und Zeitfunktionen « 12.4.2 Mathematische Funktionen
12.6 Welchen Kalender benutzt MySQL? »Section Navigation[Toggle]
12.5. Datums- und Zeitfunktionen
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->somethingFROMtbl_nameWHERE 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,INTERVALexprtype)ADDDATE(Wenn mit der Formexpr,days)INTERVALfür das zweite Argument aufgerufen, istADDDATE()ein Synonym vonDATE_ADD(). Die zugehörige FunktionSUBDATE()ist ein Synonym fürDATE_SUB(). Weitere Informationen zum ArgumentINTERVALfinden Sie in der Beschreibung zuDATE_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 Formdaysfür das zweite Argument aufgerufen, wird es von MySQL als ganzzahlige Anzahl von Tagen behandelt, dieexprhinzugefügt wird. mysql>SELECT ADDDATE('1998-01-02', 31);-> ‚1998-02-02‘ADDTIME(expr,expr2)ADDTIME()fügtexpr2exprhinzu und gibt das Ergebnis zurück.exprist eine Zeitangabe oder einDATETIME-Wert,expr2eine 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(dt,from_tz,to_tz)CONVERT_TZ()wandelt einenDATETIME-Wertdtvon der angegebenen Ausgangszeitzonefrom_tzin die Zielzeitzoneto_tzum und gibt das Ergebnis zurück. Zeitzonen werden wie in Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“, beschrieben angegeben. Die Funktion gibtNULLzurück, wenn die Argumente ungültig sind. Fiele der Wert durch die Konvertierung ausfrom_tzin UTC außerhalb des vom TypTIMESTAMPunterstützten Bereichs, dann erfolgt keine Konvertierung. Der fürTIMESTAMPgü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“.CURDATE()Gibt das aktuelle Datum als Wert in den Formaten'YYYY-MM-DD'oderYYYYMMDDaus. 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;-> 19971215CURRENT_DATE,CURRENT_DATE()CURRENT_DATEundCURRENT_DATE()sind Synonyme vonCURDATE().CURTIME()Gibt die aktuelle Uhrzeit als Wert in den Formaten'HH:MM:SS'oderHHMMSSaus. 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;-> 235026CURRENT_TIME,CURRENT_TIME()CURRENT_TIMEundCURRENT_TIME()sind Synonyme vonCURTIME().CURRENT_TIMESTAMP,CURRENT_TIMESTAMP()CURRENT_TIMESTAMPundCURRENT_TIMESTAMP()sind Synonyme vonNOW().DATE(Extrahiert den Datumsteil aus demexpr)DATE– oderDATETIME-Ausdruckexpr. mysql>SELECT DATE('2003-12-31 01:02:03');-> ‚2003-12-31‘DATEDIFF(expr,expr2)DATEDIFF()gibt die Anzahl der Tage zwischen dem Startdatumexprund dem Enddatumexpr2zurück.exprundexpr2sindDATE– oderDATETIME-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');-> -31DATE_ADD(,date,INTERVALexprtype)DATE_SUB(Diese Funktionen führen Datumsberechnungen durch.date,INTERVALexprtype)dateist einDATETIME– oderDATE-Wert, der das Startdatum angibt.exprist ein Ausdruck, der den vom Startdatum hinzuzufügenden oder abzuziehenden Intervallwert angibt.exprist dabei ein String und kann bei negativen Intervallen mit einem ‘-’ beginnen.typeist ein Schlüsselwort, das angibt, wie der Ausdruck zu interpretieren ist. Das SchlüsselwortINTERVALund die Angabetypeunterscheiden die Groß-/Kleinschreibung nicht. Die folgende Tabelle zeigt die erwartete Form des Argumentsexprfür die einzelnentype-Werte.typeWert Erwartetesexpr–FormatMICROSECONDMICROSECONDSSECONDSECONDSMINUTEMINUTESHOURHOURSDAYDAYSWEEKWEEKSMONTHMONTHSQUARTERQUARTERSYEARYEARSSECOND_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 vonexpr. Die in der Tabelle gezeigten Trennzeichen sind als Vorschläge aufzufassen. Wenn das ArgumentdateeinDATE-Wert ist und Ihre Berechnungen nur die TeileYEAR,MONTHundDAY(also keine uhrzeitbezogenen Teile) betreffen, ist das Ergebnis einDATE-Wert. Andernfalls ist das Ergebnis einDATETIME-Wert. Datumsberechnungen können auch mitINTERVALin Kombination mit den Operatoren+und-durchgeführt werden:date+ INTERVALexprtypedate– INTERVALexprtypeINTERVAList auf beiden Seiten des Operatorsexprtype+zulässig, wenn der Ausdruck auf der jeweils anderen Seite einDATE– oderDATETIME-Wert ist. Beim Operator-istINTERVALnur auf der rechten Seite der Gleichung zulässig, da das Abziehen einesexprtypeDATE– oderDATETIME-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üsselwortstypeerwartet werden), dann geht MySQL davon aus, dass Sie den linken Teil des Intervallwerts weggelassen haben. Geben Sie also etwa alstypeDAY_SECONDan, dann wird erwartet, dass der Wert vonexprTeile 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_SECONDals äquivalent zu'1:10' MINUTE_SECONDinterpretiert. Dies entspricht auch der Art und Weise, wie MySQLTIME-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 einenDATETIME-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 SieMONTH,YEAR_MONTHoderYEARhinzuaddieren 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;-> NULLDATE_FORMAT(Formatiert den Wertdate,format)dateentsprechend dem Stringformat. Die folgenden Konfigurationsangaben können im Stringformatverwendet werden. Das Zeichen ‘%’ ist vor jede Formatangabe zu setzen. Konfigurationsangabe Beschreibung%aAbgekürzter Name des Wochentags (Sun…Sat)%bAbgekürzter Name des Monats (Jan…Dec)%cMonat, numerisch (0…12)%DTag im Monat mit englischem Suffix (0th,1st,2nd,3rd, …)%dTag im Monat, numerisch (00…31)%eTag im Monat, numerisch (0…31)%fMikrosekunden (000000…999999)%HStunde (00…23)%hStunde (01…12)%IStunde (01…12)%iMinuten, numerisch (00…59)%jTag im Jahr (001…366)%kStunde (0…23)%lStunde (1…12)%MMonatsname (January…December)%mMonat, numerisch (00…12)%pAModerPM%rUhrzeit im 12-Stunden-Format (hh:mm:ssgefolgt vonAModerPM)%SSekunden (00…59)%sSekunden (00…59)%TUhrzeit im 24-Stunden-Format (hh:mm:ss)%UWoche (00…53), wobei Sonntag der erste Tag der Woche ist%uWoche (00…53), wobei Montag der erste Tag der Woche ist%VWoche (01…53), wobei Sonntag der erste Tag der Woche ist; wird mit%Xverwendet%vWoche (01…53), wobei Montag der erste Tag der Woche ist; wird mit%xverwendet%WName des Wochentags (Sunday…Saturday)%wTag in der Woche (0=Sonntag …6=Sonnabend)%XJahr der Woche, wobei Sonntag der erste Tag der Woche ist, numerisch, vierstellig; wird mit%Vverwendet%xJahr der Woche, wobei Montag der erste Tag der Woche ist, numerisch, vierstellig; wird mit%vverwendet%YJahr, numerisch, vierstellig%yJahr, numerisch, zweistellig%%Literales ‘%’-Zeichen%xx, 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(date)DAY()ist ein Synonym fürDAYOFMONTH().DAYNAME(Gibt den Namen des Wochentags fürdate)datezurück. mysql>SELECT DAYNAME('1998-02-05');-> ‚Thursday‘DAYOFMONTH(Gibt den Tag im Monat fürdate)datezurück. Der Bereich liegt zwischen0und31. mysql>SELECT DAYOFMONTH('1998-02-03');-> 3DAYOFWEEK(Gibt den Wochentagindex fürdate)datezurück (1= Sonntag,2= Montag, …,7= Sonnabend). Diese Indexwerte entsprechen dem ODBC-Standard. mysql>SELECT DAYOFWEEK('1998-02-03');-> 3DAYOFYEAR(Gibt den Tag im Jahr fürdate)datezurück. Der Bereich liegt zwischen1und366. mysql>SELECT DAYOFYEAR('1998-02-03');-> 34EXTRACT(Die FunktiontypeFROMdate)EXTRACT()verwendet dieselben Angaben für den Intervalltyp wieDATE_ADD()oderDATE_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');-> 123FROM_DAYS(Gibt für eine TagesanzahlN)NdenDATE-Wert zurück. mysql>SELECT FROM_DAYS(729669);-> ‚1997-10-07‘ Verwenden SieFROM_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(Gibt eine Darstellung desunix_timestamp,format)unix_timestamp-Arguments als Wert in den Formaten'YYYY-MM-DD HH:MM:SS'oderYYYYMMDDHHMMSSzurück. Das Ausgabeformat hängt davon ab, ob die Funktion in einem String- oder einem numerischen Kontext verwendet wird.unix_timestampist ein interner Zeitstempelwert, der von der FunktionUNIX_TIMESTAMP()erzeugt wird. Wennformatangegeben ist, wird das Ergebnis entsprechend dem Stringformatformatiert, der so verwendet wird wie im Abschnitt zur FunktionDATE_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 SieUNIX_TIMESTAMP()undFROM_UNIXTIME()zur Konvertierung zwischenTIMESTAMP-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 FunktionUNIX_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 FunktionenDATE_FORMAT()undSTR_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 zuDATE_FORMAT().) Das ISO-Format verweist auf ISO 9075, nicht auf ISO 8601. Funktionsaufruf ErgebnisGET_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'TIMESTAMPkann auch als erstes Argument fürGET_FORMAT()verwendet werden. In diesem Fall gibt die Funktion dieselben Werte wie beiDATETIMEzurü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‘HOUR(Gibt die Stundenangabe intime)timezurück. Der Bereich des Rückgabewerts liegt zwischen0und23bei Tageszeitwerten. Allerdings ist der zulässige Bereich fürTIMEwesentlich größer, d. h.,HOURkann Werte zurückgeben, die größer als23sind. mysql>SELECT HOUR('10:05:03');-> 10 mysql>SELECT HOUR('272:59:59');-> 272LAST_DAY(Nimmt einendate)DATE– oderDATETIME-Wert entgegen und gibt den entsprechenden Wert des letzten Tages des betreffenden Monats zurück. GibtNULLzurü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');-> NULLLOCALTIME,LOCALTIME()LOCALTIMEundLOCALTIME()sind Synonyme vonNOW().LOCALTIMESTAMP,LOCALTIMESTAMP()LOCALTIMESTAMPundLOCALTIMESTAMP()sind Synonyme vonNOW().MAKEDATE(Gibt ein Datum zurück, welches auf den übergebenen Werten für das Jahr und den Tag im Jahr basiert.year,dayofyear)dayofyearmuss größer als 0 sein, andernfalls ist das ErgebnisNULL. 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);-> NULLMAKETIME(Gibt einen Zeitwert zurück, der aus den Argumentenhour,minute,second)hour,minuteundsecondberechnet wird. mysql>SELECT MAKETIME(12,15,30);-> ’12:15:30′MICROSECOND(Gibt die Anzahl der Mikrosekunden für den übergebenenexpr)TIME– oderDATETIME-Ausdruckexprals Zahl im Bereich zwischen0und999999zurück. mysql>SELECT MICROSECOND('12:00:00.123456');-> 123456 mysql>SELECT MICROSECOND('1997-12-31 23:59:59.000010');-> 10MINUTE(Gibt die Minute fürtime)timeim Bereich zwischen0und59zurück. mysql>SELECT MINUTE('98-02-03 10:05:03');-> 5MONTH(Gibt den Monat fürdate)dateim Bereich zwischen0und12zurück. mysql>SELECT MONTH('1998-02-03');-> 2MONTHNAME(Gibt den vollständigen Namen des Monats fürdate)datezurück. mysql>SELECT MONTHNAME('1998-02-05');-> ‚February‘NOW()Gibt die aktuellen Werte für Datum und Uhrzeit als Wert in den FormatenYYYYMMDDHHMMSSoder'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 gibtNOW()einen Zeitpunkt als Konstante zurück, zu dem die Ausführung der Routine bzw. des Triggers begann. Hier liegt ein Unterschied zum Verhalten vonSYSDATE()vor, welches die exakte Zeit seiner Ausführung zurückgibt.PERIOD_ADD(FügtP,N)NMonate zum ZeitraumP(im FormatYYMModerYYYYMM) hinzu. Gibt einen Wert im FormatYYYYMMzurück. Beachten Sie, dass das ZeitraumargumentPkein Datumswert ist. mysql>SELECT PERIOD_ADD(9801,2);-> 199803PERIOD_DIFF(Gibt die Anzahl der Monate zwischen den ZeiträumenP1,P2)P1undP2zurück.P1undP2sollten im FormatYYMModerYYYYMMübergeben werden. Beachten Sie, dass die ZeitraumargumenteP1undP2keine Datumswerte sind. mysql>SELECT PERIOD_DIFF(9802,199703);-> 11QUARTER(Gibt das Quartal im Jahr fürdate)datezurück. Der Bereich liegt zwischen1und4. mysql>SELECT QUARTER('98-04-01');-> 2SECOND(Gibt die Sekunde fürtime)timeim Bereich zwischen0und59zurück. mysql>SELECT SECOND('10:05:03');-> 3SEC_TO_TIME(Gibt das Argumentseconds)seconds, konvertiert in Stunden, Minuten und Sekunden, als Wert in den Formaten'HH:MM:SS'oderHHMMSSaus. 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;-> 3938STR_TO_DATE(Dies ist die Umkehrung der Funktionstr,format)DATE_FORMAT(). Sie nimmt einen Stringstrund einen Format-Stringformatentgegen.STR_TO_DATE()gibt einenDATETIME-Wert zurück, wenn der Format-String sowohl Datums- als auch Uhrzeitteile enthält, oder einenDATE–TIME-Wert, wenn der String nur Datums- bzw. Uhrzeitteile umfasst. DieDATE-,TIME– oderDATETIME-Werte, die instrenthalten sind, sollten in dem Format angegeben werden, das durchformatspezifiziert wurde. Informationen zu den informatverwendbaren Konfigurationsangaben finden Sie in der Beschreibung zur FunktionDATE_FORMAT(). Wennstreinen unzulässigenDATE-,TIME– oderDATETIME-Wert enthält, gibtSTR_TO_DATE()NULLzurück. Außerdem erzeugt ein unzulässiger Wert eine Warnung. Die Bereichsprüfung der Teile von Datumswerten erfolgt wie in Abschnitt 11.3.1, „DieDATETIME-,DATE– undTIMESTAMP-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,INTERVALexprtype)SUBDATE(Wenn mit der Formexpr,days)INTERVALfür das zweite Argument aufgerufen wird, istSUBDATE()ein Synonym vonDATE_SUB(). Weitere Informationen zum ArgumentINTERVALfinden Sie in der Beschreibung zuDATE_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ürdays. In solchen Fällen wird der Wert als Anzahl von Tagen interpretiert, die vomDATE– oderDATETIME-Ausdruckexprabgezogen 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(expr,expr2)SUBTIME()ziehtexpr2vonexprab und gibt das Ergebnis zurück.exprist eine Uhrzeitangabe oder einDATETIME-Wert,expr2eine 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‘SYSDATE()Gibt die aktuellen Werte für Datum und Uhrzeit als Wert in den FormatenYYYYMMDDHHMMSSoder'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 gibtSYSDATE()die Zeit zurück, zu der sie ausgeführt wird. Dies unterscheidet sich vom Verhalten vonNOW(), welches die Uhrzeit zurückgibt, zu der die Ausführung der Routine- oder Trigger-Anweisung begann.TIME(Extrahiert den Zeitbestandteil desexpr)TIME– oderDATETIME-Ausdrucksexprund 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(expr,expr2)TIMEDIFF()gibt den Zeitraum zwischen der Startzeitexprund der Endzeitexpr2zurück.exprundexpr2sind Zeit- oderDATETIME-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(Bei nur einem Argument gibt diese Funktion den Datums- oderexpr,expr2)DATETIME-AusdruckexpralsDATETIME-Wert zurück. Bei zwei Argumenten wird der Zeitausdruckexpr2zum Datums- oderDATETIME-Ausdruckexprhinzugefügt und das Ergebnis alsDATETIME-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(Fügt den Integer-Ausdruckinterval,int_expr,datetime_expr)int_exprzum Datums- oderDATETIME-Ausdruckdatetime_exprhinzu. Die Einheit fürint_exprwird durch das Argumentintervalangegeben, das einen der folgenden Werte haben sollte:FRAC_SECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTERoderYEAR. Derinterval-Wert kann mithilfe eines der angegebenen Schlüsselwörter oder mit dem PräfixSQL_TSI_angegeben werden. Beispielsweise sind sowohlDAYals auchSQL_TSI_DAYzulä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(Gibt den Unterschied zwischen den Datums- oderinterval,datetime_expr1,datetime_expr2)DATETIME-Ausdrückendatetime_expr1unddatetime_expr2zurück. Die Einheit für das Ergebnis wird über das Argumentintervalangegeben. Die zulässigen Werte fürintervalentsprechen den in der Beschreibung zuTIMESTAMPADD()aufgelisteten Optionen. mysql>SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');-> 3 mysql>SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');-> -1TIME_FORMAT(Wird wie die Funktiontime,format)DATE_FORMAT()verwendet, der Stringformatdarf aber nur Formatangaben für Stunden, Minuten und Sekunden enthalten. Andere Konfigurationsangaben erzeugen einenNULL-Wert oder0. Wenn dertime-Wert einen Stundenbestandteil enthält, der größer als23ist, erzeugen die Stundenformatangaben%Hund%keinen Wert, der größer ist als der normale Bereich0 ... 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‘TIME_TO_SEC(Gibt das Argumenttime)timein Sekunden konvertiert zurück. mysql>SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql>SELECT TIME_TO_SEC('00:39:38');-> 2378TO_DAYS(Gibt zu einem Datumdate)dateeine 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');-> 729669TO_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, 729669UNIX_TIMESTAMP(),UNIX_TIMESTAMP(Sofern ohne Argument aufgerufen, gibt die Funktion einen Unix-Zeitstempel (Sekunden seitdate)'1970-01-01 00:00:00'im UTC-Format) als vorzeichenlosen Integer zurück. WennUNIX_TIMESTAMP()mit einem Argumentdateaufgerufen wird, gibt es den Wert des Arguments als seit dem Zeitpunkt'1970-01-01 00:00:00'(UTC) verstrichene Sekunden zurück.datekann einDATE-String, einDATETIME-String, einTIMESTAMPoder eine Zahl im FormatYYMMDDoderYYYYMMDDsein. Der Server interpretiertdateals 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 WennUNIX_TIMESTAMPfür eineTIMESTAMP-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 anUNIX_TIMESTAMP()übergeben, wird0zurückgegeben. Hinweis: Wenn SieUNIX_TIMESTAMP()undFROM_UNIXTIME()zur Konvertierung zwischenTIMESTAMP-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 zweiUNIX_TIMESTAMP()-Funktionen zweiTIMESTAMP-Werte in denselben Unix-Zeitstempelwert umwandeln.FROM_UNIXTIME()wiederum konvertiert den Wert dann in nur einen der ursprünglichenTIMESTAMP-Werte zurück. Es folgt ein Beispiel unter Verwendung vonTIMESTAMP-Werten in der ZeitzoneCET(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 SieUNIX_TIMESTAMP()-Spalten subtrahieren wollen, sollten Sie das Ergebnis in vorzeichenbehaftete Integers umwandeln. Siehe auch Abschnitt 12.8, „Cast-Funktionen und Operatoren“.UTC_DATE,UTC_DATE()Gibt das aktuelle UTC-Datum als Wert in den Formaten'YYYY-MM-DD'oderYYYYMMDDaus. 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‘, 20030814UTC_TIME,UTC_TIME()Gibt die aktuelle UTC-Uhrzeit als Wert in den Formaten'HH:MM:SS'oderHHMMSSaus. 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′, 180753UTC_TIMESTAMP,UTC_TIMESTAMP()Gibt die aktuellen UTC-Werte für Datum und Uhrzeit als Wert in den FormatenYYYYMMDDHHMMSSoder'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‘, 20030814180804WEEK(Diese Funktion gibt die Nummer der Woche fürdate[,mode])datezurück. WirdWEEK()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 zwischen0und53oder1und53liegen soll. Wird das Argumentmodeweggelassen, so wird der Wert der Systemvariablendefault_week_formatverwendet. Siehe auch Abschnitt 5.2.2, „Server-Systemvariablen“. Die folgende Tabelle beschreibt, wie das Argumentmodefunktioniert. 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, MySQL0zurückgibt, sofern Sie nicht2,3,6oder7als optionalesmode-Argument angeben: mysql>SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);-> 2000, 0 Man könnte nun anführen, dass MySQL doch eigentlich52für die FunktionWEEK()zurückgeben sollte, da das angegebene Datum eigentlich in der 52. Woche des Jahres 1999 liegt. Wir haben aber beschlossen, stattdessen0zurückgeben zu lassen, weil die Funktion „Nummer der Woche im angegebenen Jahr“ zurückgeben soll. Dies macht die Verwendung der FunktionWEEK()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 Sie0,2,5oder7als optionalesmode-Argument. mysql>SELECT WEEK('2000-01-01',2);-> 52 Alternativ verwenden Sie die FunktionYEARWEEK(): mysql>SELECT YEARWEEK('2000-01-01');-> 199952 mysql>SELECT MID(YEARWEEK('2000-01-01'),5,2);-> ’52‘WEEKDAY(Gibt den Wochentagindex fürdate)datezurück (0= Montag,1= Dienstag, …,6= Sonntag). mysql>SELECT WEEKDAY('1998-02-03 22:23:00');-> 1 mysql>SELECT WEEKDAY('1997-11-05');-> 2WEEKOFYEAR(Gibt die Kalenderwoche des Datums als Zahl im Bereich zwischendate)1und53zurück.WEEKOFYEAR()ist eine Kompatibilitätsfunktion, die äquivalent zuWEEK(ist. mysql>date,3)SELECT WEEKOFYEAR('1998-02-20');-> 8YEAR(Gibt das Jahr fürdate)dateim Bereich zwischen1000und9999oder aber0für das „Nulldatum“ zurück. mysql>SELECT YEAR('98-02-03');-> 1998YEARWEEK(,date)YEARWEEK(Gibt Jahr und Woche für ein Datum zurück. Das Argumentdate,start)startfunktioniert ganz genauso wie das ArgumentstartfürWEEK(). 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 FunktionWEEK()für ihre optionalen Argumente0oder1zurückgäbe (nämlich0), unterscheidet, dennWEEK()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.