sql >> Databasteknik >  >> RDS >> MariaDB

Hur EXTRACT() fungerar i MariaDB

I MariaDB, EXTRACT() är en inbyggd datum- och tidsfunktion som returnerar den angivna enheten från ett givet datum- eller datetime-uttryck.

Syntax

Syntaxen ser ut så här:

EXTRACT(unit FROM date)

Där unit är en giltig datum- och tidsenhet och date är datumet att extrahera den enheten från.

Exempel

Här är ett exempel som extraherar året från ett datum:

SELECT EXTRACT(YEAR FROM '2030-12-25');

Resultat:

+---------------------------------+
| EXTRACT(YEAR FROM '2030-12-25') |
+---------------------------------+
|                            2030 |
+---------------------------------+

Här är en annan som extraherar dagen:

SELECT EXTRACT(DAY FROM '2030-12-25');

Resultat:

+--------------------------------+
| EXTRACT(DAY FROM '2030-12-25') |
+--------------------------------+
|                             25 |
+--------------------------------+

Datetime-värden

Det fungerar också med datetime-värden:

SELECT EXTRACT(HOUR FROM '2030-02-01 10:30:45');

Resultat:

+------------------------------------------+
| EXTRACT(HOUR FROM '2030-02-01 10:30:45') |
+------------------------------------------+
|                                       10 |
+------------------------------------------+

Datum- och tidsenheter

Här är ett annat exempel som går igenom varje enhet i datetime-uttrycket:

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;

Resultat:

+------+-------+------+------+--------+--------+-------------+
| YEAR | MONTH | DAY  | HOUR | MINUTE | SECOND | MICROSECOND |
+------+-------+------+------+--------+--------+-------------+
| 2030 |     2 |    1 |   10 |     30 |     45 |      123456 |
+------+-------+------+------+--------+--------+-------------+

Kompositenheter

Här är ett exempel som använder en sammansatt enhet. Sammansatta enheter består av flera bastidsenheter.

SELECT EXTRACT(YEAR_MONTH FROM '2030-02-01');

Resultat:

+---------------------------------------+
| EXTRACT(YEAR_MONTH FROM '2030-02-01') |
+---------------------------------------+
|                                203002 |
+---------------------------------------+

Noll enheter

Noll enheter resulterar i 0 .

Exempel:

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;

Resultat:

+------+-------+------+------+--------+--------+-------------+
| YEAR | MONTH | DAY  | HOUR | MINUTE | SECOND | MICROSECOND |
+------+-------+------+------+--------+--------+-------------+
|    0 |     0 |    0 |    0 |      0 |      0 |           0 |
+------+-------+------+------+--------+--------+-------------+

Numeriska datum

Det är också möjligt att skicka datum som ett nummer, så länge det är vettigt som ett datum.

Exempel

SELECT EXTRACT(MONTH FROM 20301125);

Resultat:

+------------------------------+
| EXTRACT(MONTH FROM 20301125) |
+------------------------------+
|                           11 |
+------------------------------+

Eller till och med följande (som använder ett tvåsiffrigt år):

SELECT EXTRACT(YEAR FROM 301125);

Resultat:

+---------------------------+
| EXTRACT(YEAR FROM 301125) |
+---------------------------+
|                      2030 |
+---------------------------+

Men var försiktig här – MariaDB måste i princip gissa vilket år det är. Så här händer om jag ökar året från 30 till 80:

SELECT EXTRACT(YEAR FROM 801125);

Resultat:

+---------------------------+
| EXTRACT(YEAR FROM 801125) |
+---------------------------+
|                      1980 |
+---------------------------+

Så i det här fallet skickar du 30 resulterade i 2030 men klarar 80 returnerade 1980 .

Det måste också vara vettigt som ett datum. Så här händer om jag använder en ogiltig dag:

SELECT EXTRACT(YEAR FROM 20300135);

Resultat:

+-----------------------------+
| EXTRACT(YEAR FROM 20300135) |
+-----------------------------+
|                        NULL |
+-----------------------------+

Andra avgränsare

Du kan använda andra avgränsare för datumet. MariaDB är ganska förlåtande när det kommer till avgränsare på datum. Här är några giltiga exempel:

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');

Resultat (med vertikal utdata):

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

Aktuellt datum

Vi kan skicka NOW() som datumargument för att använda det aktuella datumet:

SELECT 
    NOW(),
    EXTRACT(MONTH FROM NOW());

Resultat:

+---------------------+---------------------------+
| NOW()               | EXTRACT(MONTH FROM NOW()) |
+---------------------+---------------------------+
| 2021-05-16 10:06:21 |                         5 |
+---------------------+---------------------------+

Ogiltiga datum

När ett ogiltigt datum passerat, EXTRACT() returnerar null :

SELECT EXTRACT(YEAR FROM 'Friday');

Resultat:

+-----------------------------+
| EXTRACT(YEAR FROM 'Friday') |
+-----------------------------+
|                        NULL |
+-----------------------------+

Ogiltig datum-/tidsenhet

När en ogiltig datum-/tidsenhet passerats, EXTRACT() returnerar ett fel:

SELECT EXTRACT(DECADE FROM '2030-06-25');

Resultat:

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

Argument saknas

Anropar EXTRACT() utan att skicka några argument resulterar i ett fel:

SELECT EXTRACT();

Resultat:

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

  1. Vad är SQL Server dödläge?

  2. Hur kan jag få en vanlig postgres-databasdump på heroku?

  3. Hur kan jag konvertera bockar till ett datumformat?

  4. SQL - Hitta sats som infogar specifika värden