In MariaDB EXTRACT()
ist eine integrierte Datums- und Zeitfunktion, die die angegebene Einheit aus einem bestimmten Datums- oder Datumszeitausdruck zurückgibt.
Syntax
Die Syntax lautet wie folgt:
EXTRACT(unit FROM date)
Wobei unit
ist eine gültige Datums- und Zeiteinheit und date
ist das Datum, aus dem diese Einheit extrahiert werden soll.
Beispiel
Hier ist ein Beispiel, das das Jahr aus einem Datum extrahiert:
SELECT EXTRACT(YEAR FROM '2030-12-25');
Ergebnis:
+---------------------------------+ | EXTRACT(YEAR FROM '2030-12-25') | +---------------------------------+ | 2030 | +---------------------------------+
Hier ist eine weitere, die den Tag extrahiert:
SELECT EXTRACT(DAY FROM '2030-12-25');
Ergebnis:
+--------------------------------+ | EXTRACT(DAY FROM '2030-12-25') | +--------------------------------+ | 25 | +--------------------------------+
Datum/Uhrzeit-Werte
Es funktioniert auch mit datetime-Werten:
SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');
Ergebnis:
+------------------------------------------+ | EXTRACT(HOUR FROM '2030-02-01 10:30:45') | +------------------------------------------+ | 10 | +------------------------------------------+
Datums- und Zeiteinheiten
Hier ist ein weiteres Beispiel, das jede Einheit im datetime-Ausdruck durchläuft:
SELECT
EXTRACT(YEAR FROM '2030-02-01 10:30:45.123456') AS YEAR,
EXTRACT(MONTH FROM '2030-02-01 10:30:45.123456') AS MONTH,
EXTRACT(DAY FROM '2030-02-01 10:30:45.123456') AS DAY,
EXTRACT(HOUR FROM '2030-02-01 10:30:45.123456') AS HOUR,
EXTRACT(MINUTE FROM '2030-02-01 10:30:45.123456') AS MINUTE,
EXTRACT(SECOND FROM '2030-02-01 10:30:45.123456') AS SECOND,
EXTRACT(MICROSECOND FROM '2030-02-01 10:30:45.123456') AS MICROSECOND;
Ergebnis:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 2030 | 2 | 1 | 10 | 30 | 45 | 123456 | +------+-------+------+------+--------+--------+-------------+
Zusammengesetzte Einheiten
Hier ist ein Beispiel, das eine zusammengesetzte Einheit verwendet. Zusammengesetzte Einheiten bestehen aus mehreren Basiszeiteinheiten.
SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');
Ergebnis:
+---------------------------------------+ | EXTRACT(YEAR_MONTH FROM '2030-02-01') | +---------------------------------------+ | 203002 | +---------------------------------------+
Null Einheiten
Nulleinheiten ergeben 0
.
Beispiel:
SELECT
EXTRACT(YEAR FROM '0000-00-00 00:00:00.000000') AS YEAR,
EXTRACT(MONTH FROM '0000-00-00 00:00:00.000000') AS MONTH,
EXTRACT(DAY FROM '0000-00-00 00:00:00.000000') AS DAY,
EXTRACT(HOUR FROM '0000-00-00 00:00:00.000000') AS HOUR,
EXTRACT(MINUTE FROM '0000-00-00 00:00:00.000000') AS MINUTE,
EXTRACT(SECOND FROM '0000-00-00 00:00:00.000000') AS SECOND,
EXTRACT(MICROSECOND FROM '0000-00-00 00:00:00.000000') AS MICROSECOND;
Ergebnis:
+------+-------+------+------+--------+--------+-------------+ | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MICROSECOND | +------+-------+------+------+--------+--------+-------------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------+-------+------+------+--------+--------+-------------+
Numerische Daten
Es ist auch möglich, Datumsangaben als Zahl zu übergeben, sofern es als Datum sinnvoll ist.
Beispiel
SELECT EXTRACT(MONTH FROM 20301125);
Ergebnis:
+------------------------------+ | EXTRACT(MONTH FROM 20301125) | +------------------------------+ | 11 | +------------------------------+
Oder sogar das Folgende (das eine zweistellige Jahreszahl verwendet):
SELECT EXTRACT(YEAR FROM 301125);
Ergebnis:
+---------------------------+ | EXTRACT(YEAR FROM 301125) | +---------------------------+ | 2030 | +---------------------------+
Aber Vorsicht hier – MariaDB muss grundsätzlich erraten, um welches Jahr es sich handelt. Folgendes passiert, wenn ich das Jahr von 30 auf 80 erhöhe:
SELECT EXTRACT(YEAR FROM 801125);
Ergebnis:
+---------------------------+ | EXTRACT(YEAR FROM 801125) | +---------------------------+ | 1980 | +---------------------------+
In diesem Fall wird also 30
übergeben führte zu 2030
aber 80
übergeben gab 1980
zurück .
Außerdem muss es als Datum sinnvoll sein. Folgendes passiert, wenn ich einen ungültigen Tag verwende:
SELECT EXTRACT(YEAR FROM 20300135);
Ergebnis:
+-----------------------------+ | EXTRACT(YEAR FROM 20300135) | +-----------------------------+ | NULL | +-----------------------------+
Andere Trennzeichen
Sie können andere Trennzeichen für das Datum verwenden. MariaDB ist ziemlich nachsichtig, wenn es um Trennzeichen bei Datumsangaben geht. Hier sind einige gültige Beispiele:
SELECT
EXTRACT(MONTH FROM '2030/06/25'),
EXTRACT(MONTH FROM '2030,06,25'),
EXTRACT(MONTH FROM '2030:06:25'),
EXTRACT(MONTH FROM '2030;06!25');
Ergebnis (bei vertikaler Ausgabe):
EXTRACT(MONTH FROM '2030/06/25'): 6 EXTRACT(MONTH FROM '2030,06,25'): 6 EXTRACT(MONTH FROM '2030:06:25'): 6 EXTRACT(MONTH FROM '2030;06!25'): 6
Aktuelles Datum
Wir können NOW()
übergeben als Datumsargument, um das aktuelle Datum zu verwenden:
SELECT
NOW(),
EXTRACT(MONTH FROM NOW());
Ergebnis:
+---------------------+---------------------------+ | NOW() | EXTRACT(MONTH FROM NOW()) | +---------------------+---------------------------+ | 2021-05-16 10:06:21 | 5 | +---------------------+---------------------------+
Ungültige Daten
Wenn ein ungültiges Datum übergeben wird, EXTRACT()
gibt null
zurück :
SELECT EXTRACT(YEAR FROM 'Friday');
Ergebnis:
+-----------------------------+ | EXTRACT(YEAR FROM 'Friday') | +-----------------------------+ | NULL | +-----------------------------+
Ungültige Datums-/Zeiteinheit
Wenn eine ungültige Datums-/Zeiteinheit übergeben wird, EXTRACT()
gibt einen Fehler zurück:
SELECT EXTRACT(DECADE FROM '2030-06-25');
Ergebnis:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECADE FROM '2030-06-25')' at line 1
Fehlendes Argument
Aufruf von EXTRACT()
ohne Argumente zu übergeben führt zu einem Fehler:
SELECT EXTRACT();
Ergebnis:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1