I MySQL, YEAR()
är en inbyggd datum- och tidsfunktion som returnerar året från ett givet datumuttryck.
Den returnerar året som ett tal i intervallet 1000
till 9999
. För noll datum kan den returnera 0
eller NULL
med en varning, beroende på värdena i ditt sql_mode
.
Syntax
Syntaxen ser ut så här:
YEAR(date)
Där date
är datumuttrycket att hämta årtalet från.
Exempel
Här är ett exempel:
SELECT YEAR('2045-12-10');
Resultat:
2045
Datetime-värden
Det fungerar också med datetime-värden:
SELECT YEAR('2045-12-10 18:52:17');
Resultat:
2045
Noll datum
Enligt MySQL-dokumentationen resulterar noll datum i 0
. Det faktiska resultatet kommer dock att bero på värdet på ditt sql_mode
systemvariabel.
Som standard är noll datum inte tillåtna, och därför producerar följande NULL
med en varning:
SELECT YEAR('0000-00-00');
Resultat:
+----------------------------+| ÅR('0000-00-00') |+------------------------+| NULL |+--------------------+1 rad i set, 1 varning (0,00 sek)
Och här är varningen:
show warnings;
Resultat:
+--------+------+------------------------------------ -----------+| Nivå | Kod | Meddelande |+--------+------+-------------------------------------- ----------+| Varning | 1292 | Felaktigt datetime-värde:'0000-00-00' |+---------+------+--------------------- --------------------+
Jag fick den här varningen eftersom mitt sql_mode
systemvariabeln inkluderar NO_ZERO_DATE
och 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
Låt oss återställa mitt sql_mode
utan dessa värden:
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
Låt oss nu köra YEAR()
funktion igen med nolldatum:
SELECT YEAR('0000-00-00');
Resultat:
0
Den här gången får vi 0
, enligt dokumentationen.
Observera att NO_ZERO_DATE
och NO_ZERO_IN_DATE
är utfasade i skrivande stund. Därför kan de tas bort när som helst.
Numeriska datum
Det är också möjligt att skicka datum som ett nummer, så länge det är vettigt som ett datum.
Exempel:
SELECT YEAR(20451210);
Resultat:
2045
Eller till och med följande (som använder ett tvåsiffrigt år):
SELECT YEAR(451210);
Resultat:
2045
Men det måste vara vettigt som en dejt. Så här händer om jag ökar dagdelen till en ogiltig dag:
SELECT YEAR(20451265);
Resultat:
+----------------+| ÅR(20451265) |+----------------+| NULL |+----------------+1 rad i set, 1 varning (0,00 sek)
Vi kan kontrollera varningen så här:
show warnings;
Resultat:
+--------+------+------------------------------------ ----------+| Nivå | Kod | Meddelande |+--------+------+-------------------------------------- --------+| Varning | 1292 | Felaktigt datetime-värde:'20451265' |+--------+------+------------------------ --------------+
Andra avgränsare
Du kan använda andra avgränsare för datumet. MySQL är ganska förlåtande när det kommer till avgränsare på datum. Här är några giltiga exempel:
SELECT
YEAR('2045/12/10'),
YEAR('2045,12,10'),
YEAR('2045:12:10'),
YEAR('2045;12!10');
Resultat (med vertikal utdata):
YEAR('2045/12/10'):2045YEAR('2045,12,10'):2045YEAR('2045:12:10'):2045YEAR('2045;12!10'):2045Aktuellt datum
Vi kan skicka
NOW()
som datetime-argument för att använda det aktuella datumet:SELECT NOW(), YEAR(NOW());
Resultat:
+----------------------------+-------------+| NU() | ÅR(NU()) |+----------------------------+------------+| 2021-10-17 11:09:23 | 2021 |+---------------------+-------------+Ogiltiga argument
När ett ogiltigt argument skickades,
YEAR()
returnerarnull
:SELECT YEAR('2030-65-78');
Resultat:
+----------------------------+| ÅR('2030-65-78') |+------------------------+| NULL |+--------------------+1 rad i set, 1 varning (0,00 sek)Kontrollera varningen:
SHOW WARNINGS;
Resultat:
+--------+------+------------------------------------ -----------+| Nivå | Kod | Meddelande |+--------+------+-------------------------------------- ----------+| Varning | 1292 | Felaktigt datetime-värde:'2030-65-78' |+---------+------+-------------------- --------------------+Argument saknas
Anropar
YEAR()
med fel antal argument, eller utan att skicka några argument, resulterar i ett fel:SELECT YEAR();
Resultat:
ERROR 1064 (42000):Du har ett fel i din SQL-syntax; kontrollera manualen som motsvarar din MySQL-serverversion för rätt syntax att använda nära ')' på rad 1Och ett annat exempel:
SELECT YEAR('2030-12-10', '2031-12-10');
Resultat:
ERROR 1064 (42000):Du har ett fel i din SQL-syntax; kontrollera manualen som motsvarar din MySQL-serverversion för rätt syntax att använda nära ', '2031-12-10')' på rad 1