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'):2045Aktuel 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()
returnerernull
: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 1Og 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