sql >> Database teknologi >  >> RDS >> Mysql

YEAR() Eksempler – MySQL

I MySQL, YEAR() er en indbygget dato- og tidsfunktion, der returnerer året fra et givet datoudtryk.

Det returnerer året som et tal i området 1000 til 9999 . For nul datoer kunne den returnere 0 eller NULL med en advarsel, afhængigt af værdierne i din sql_mode .

Syntaks

Syntaksen ser sådan ud:

YEAR(date) 

Hvor date er datoudtrykket, der skal hentes året fra.

Eksempel

Her er et eksempel:

SELECT YEAR('2045-12-10'); 

Resultat:

2045

Dato-tidsværdier

Det fungerer også med datetime-værdier:

SELECT YEAR('2045-12-10 18:52:17'); 

Resultat:

2045

Nul datoer

Ifølge MySQL-dokumentationen resulterer nul datoer i 0 . Det faktiske resultat vil dog afhænge af værdien af ​​din sql_mode systemvariabel.

Som standard er nul datoer ikke tilladt, og derfor producerer følgende NULL med en advarsel:

SELECT YEAR('0000-00-00'); 

Resultat:

+---------------------------+| ÅR('0000-00-00') |+--------------------+| NULL |+--------------------+1 række i sæt, 1 advarsel (0,00 sek.)

Og her er advarslen:

show warnings; 

Resultat:

+--------+------+------------------------------------- -----------+| Niveau | Kode | Besked |+--------+------+-------------------------------------- ----------+| Advarsel | 1292 | Forkert datetime-værdi:'0000-00-00' |+---------+------+--------------------- --------------------+

Jeg fik denne advarsel, fordi min sql_mode systemvariablen inkluderer NO_ZERO_DATE og NO_ZERO_IN_DATE :

SELECT @@SESSION.sql_mode; 

Resultat:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Lad os nulstille min sql_mode uden disse værdier:

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode; 

Resultat:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Lad os nu køre YEAR() funktion igen med nuldatoen:

SELECT YEAR('0000-00-00'); 

Resultat:

0

Denne gang får vi 0 , i henhold til dokumentationen.

Bemærk, at NO_ZERO_DATE og NO_ZERO_IN_DATE er forældet i skrivende stund. Derfor kunne de fjernes når som helst.

Numeriske datoer

Det er også muligt at videregive datoer som et tal, så længe det giver mening som en dato.

Eksempel:

SELECT YEAR(20451210); 

Resultat:

2045

Eller endda følgende (som bruger et tocifret årstal):

SELECT YEAR(451210); 

Resultat:

2045

Men det skal give mening som en date. Her er, hvad der sker, hvis jeg øger dagsdelen til en ugyldig dag:

SELECT YEAR(20451265); 

Resultat:

+----------------+| ÅR(20451265) |+----------------+| NULL |+----------------+1 række i sæt, 1 advarsel (0,00 sek.)

Vi kan tjekke advarslen sådan her:

show warnings; 

Resultat:

+--------+------+------------------------------------- ----------+| Niveau | Kode | Besked |+--------+------+-------------------------------------- --------+| Advarsel | 1292 | Forkert datetime-værdi:'20451265' |+--------+------+------------------------ --------------+

Andre afgrænsninger

Du kan bruge andre skilletegn for datoen. MySQL er ret tilgivende, når det kommer til afgrænsninger på datoer. Her er nogle gyldige eksempler:

SELECT 
    YEAR('2045/12/10'),
    YEAR('2045,12,10'),
    YEAR('2045:12:10'),
    YEAR('2045;12!10'); 

Resultat (ved hjælp af lodret output):

YEAR('2045/12/10'):2045YEAR('2045,12,10'):2045YEAR('2045:12:10'):2045YEAR('2045;12!10'):2045 

Aktuel dato

Vi kan sende NOW() som datetime-argument for at bruge den aktuelle dato:

SELECT 
    NOW(),
    YEAR(NOW()); 

Resultat:

+----------------------------+-------------+| NU() | ÅR(NU()) |+----------------------+------------+| 17-10-2021 11:09:23 | 2021 |+---------------------+-------------+

Ugyldige argumenter

Når et ugyldigt argument sendes, YEAR() returnerer null :

SELECT YEAR('2030-65-78'); 

Resultat:

+---------------------------+| ÅR('2030-65-78') |+------------------------+| NULL |+--------------------+1 række i sæt, 1 advarsel (0,00 sek.)

Tjek advarslen:

SHOW WARNINGS; 

Resultat:

+--------+------+------------------------------------- -----------+| Niveau | Kode | Besked |+--------+------+-------------------------------------- ----------+| Advarsel | 1292 | Forkert datetime-værdi:'2030-65-78' |+---------+------+-------------------- --------------------+

Manglende argument

Kalder YEAR() med det forkerte antal argumenter, eller uden at sende nogen argumenter, resulterer det i en fejl:

SELECT YEAR(); 

Resultat:

FEJL 1064 (42000):Du har en fejl i din SQL-syntaks; tjek manualen, der svarer til din MySQL-serverversion for den rigtige syntaks at bruge i nærheden af ​​')' på linje 1

Og endnu et eksempel:

SELECT YEAR('2030-12-10', '2031-12-10'); 

Resultat:

FEJL 1064 (42000):Du har en fejl i din SQL-syntaks; tjek manualen, der svarer til din MySQL-serverversion for den rigtige syntaks til brug nær ', '2031-12-10')' på linje 1

  1. MySQL Data - Bedste måde at implementere personsøgning?

  2. MySQL - Gør et eksisterende felt unikt

  3. Konverter float til varchar i SQL Server uden videnskabelig notation

  4. Brug af flere PostgreSQL-skemaer med Rails-modeller