In MySQL, YEAR()
is een ingebouwde datum- en tijdfunctie die het jaar retourneert uit een bepaalde datumuitdrukking.
Het geeft het jaar terug als een getal in het bereik 1000
tot 9999
. Voor nuldatums kan het 0
. retourneren of NULL
met een waarschuwing, afhankelijk van de waarden in uw sql_mode
.
Syntaxis
De syntaxis gaat als volgt:
YEAR(date)
Waar date
is de datumuitdrukking om het jaar uit te halen.
Voorbeeld
Hier is een voorbeeld:
SELECT YEAR('2045-12-10');
Resultaat:
2045
Datum/tijd-waarden
Het werkt ook met datetime-waarden:
SELECT YEAR('2045-12-10 18:52:17');
Resultaat:
2045
Nul datums
Volgens de MySQL-documentatie resulteren nuldatums in 0
. Het werkelijke resultaat hangt echter af van de waarde van uw sql_mode
systeem variabele.
Standaard zijn nuldatums niet toegestaan, en daarom produceert het volgende NULL
met een waarschuwing:
SELECT YEAR('0000-00-00');
Resultaat:
+--------------------+ | YEAR('0000-00-00') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
En hier is de waarschuwing:
show warnings;
Resultaat:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+
Ik kreeg deze waarschuwing omdat mijn sql_mode
systeemvariabele bevat NO_ZERO_DATE
en NO_ZERO_IN_DATE
:
SELECT @@SESSION.sql_mode;
Resultaat:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Laten we mijn sql_mode
resetten zonder die waarden:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode;
Resultaat:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Laten we nu de YEAR()
. uitvoeren functie opnieuw met de nuldatum:
SELECT YEAR('0000-00-00');
Resultaat:
0
Deze keer krijgen we 0
, volgens de documentatie.
Merk op dat NO_ZERO_DATE
en NO_ZERO_IN_DATE
zijn op het moment van schrijven afgekeurd. Daarom kunnen ze op elk moment worden verwijderd.
Numerieke datums
Het is ook mogelijk om datums als een getal door te geven, zolang het maar logisch is als een datum.
Voorbeeld:
SELECT YEAR(20451210);
Resultaat:
2045
Of zelfs het volgende (met een jaartal van twee cijfers):
SELECT YEAR(451210);
Resultaat:
2045
Maar het moet logisch zijn als een date. Dit gebeurt er als ik het daggedeelte verhoog naar een ongeldige dag:
SELECT YEAR(20451265);
Resultaat:
+----------------+ | YEAR(20451265) | +----------------+ | NULL | +----------------+ 1 row in set, 1 warning (0.00 sec)
We kunnen de waarschuwing als volgt controleren:
show warnings;
Resultaat:
+---------+------+--------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------+ | Warning | 1292 | Incorrect datetime value: '20451265' | +---------+------+--------------------------------------+
Andere scheidingstekens
U kunt andere scheidingstekens voor de datum gebruiken. MySQL is vrij vergevingsgezind als het gaat om scheidingstekens op datums. Hier zijn enkele geldige voorbeelden:
SELECT
YEAR('2045/12/10'),
YEAR('2045,12,10'),
YEAR('2045:12:10'),
YEAR('2045;12!10');
Resultaat (met verticale uitvoer):
YEAR('2045/12/10'): 2045 YEAR('2045,12,10'): 2045 YEAR('2045:12:10'): 2045 YEAR('2045;12!10'): 2045
Huidige datum
We kunnen NOW()
doorgeven als het datetime-argument om de huidige datum te gebruiken:
SELECT
NOW(),
YEAR(NOW());
Resultaat:
+---------------------+-------------+ | NOW() | YEAR(NOW()) | +---------------------+-------------+ | 2021-10-17 11:09:23 | 2021 | +---------------------+-------------+
Ongeldige argumenten
Wanneer een ongeldig argument wordt doorgegeven, YEAR()
retourneert null
:
SELECT YEAR('2030-65-78');
Resultaat:
+--------------------+ | YEAR('2030-65-78') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
Controleer de waarschuwing:
SHOW WARNINGS;
Resultaat:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '2030-65-78' | +---------+------+----------------------------------------+
Ontbrekend argument
Bellen YEAR()
met het verkeerde aantal argumenten, of zonder het doorgeven van argumenten, resulteert in een fout:
SELECT YEAR();
Resultaat:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
En nog een voorbeeld:
SELECT YEAR('2030-12-10', '2031-12-10');
Resultaat:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ', '2031-12-10')' at line 1