В MySQL, YEAR()
е вградена функция за дата и час, която връща годината от даден израз за дата.
Връща годината като число в диапазона 1000
до 9999
. За нулеви дати може да върне 0
или NULL
с предупреждение, в зависимост от стойностите във вашия sql_mode
.
Синтаксис
Синтаксисът е така:
YEAR(date)
Където date
е изразът за дата, от който да получите годината.
Пример
Ето един пример:
SELECT YEAR('2045-12-10');
Резултат:
2045
Стойности за дата и час
Работи и със стойности за дата и час:
SELECT YEAR('2045-12-10 18:52:17');
Резултат:
2045
Нулеви дати
Според документацията на MySQL нулевите дати водят до 0
. Реалният резултат обаче ще зависи от стойността на вашия sql_mode
системна променлива.
По подразбиране нулевите дати не са разрешени и следователно извършването на следното произвежда NULL
с предупреждение:
SELECT YEAR('0000-00-00');
Резултат:
+-------------------+| ГОДИНА('0000-00-00') |+-------------------+| NULL |+-------------------+1 ред в комплект, 1 предупреждение (0,00 сек)
И ето предупреждението:
show warnings;
Резултат:
+--------+------+---------------------------- -----------+| Ниво | Код | Съобщение |+--------+------+------------------------------ ----------+| Предупреждение | 1292 | Неправилна стойност за дата и час:'0000-00-00' |+---------+------+------------------- --------------------+
Получих това предупреждение, защото моят sql_mode
системната променлива включва NO_ZERO_DATE
и NO_ZERO_IN_DATE
:
SELECT @@SESSION.sql_mode;
Резултат:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Нека нулираме моя sql_mode
без тези стойности:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode;
Резултат:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Сега нека изпълним YEAR()
функция отново с нулева дата:
SELECT YEAR('0000-00-00');
Резултат:
0
Този път получаваме 0
, съгласно документацията.
Обърнете внимание, че NO_ZERO_DATE
и NO_ZERO_IN_DATE
са отхвърлени към момента на писане. Следователно те могат да бъдат премахнати по всяко време.
Числови дати
Възможно е също да предавате дати като число, стига да има смисъл като дата.
Пример:
SELECT YEAR(20451210);
Резултат:
2045
Или дори следното (което използва двуцифрена година):
SELECT YEAR(451210);
Резултат:
2045
Но трябва да има смисъл като среща. Ето какво се случва, ако увелича частта от деня до невалиден ден:
SELECT YEAR(20451265);
Резултат:
+----------------+| ГОДИНА(20451265) |+----------------+| NULL |+----------------+1 ред в комплект, 1 предупреждение (0,00 сек.)
Можем да проверим предупреждението по следния начин:
show warnings;
Резултат:
+--------+------+---------------------------- ---------+| Ниво | Код | Съобщение |+--------+------+------------------------------ --------+| Предупреждение | 1292 | Неправилна стойност за дата и час:'20451265' |+--------+------+------------------------ --------------+
Други ограничители
Можете да използвате други разделители за датата. MySQL е доста прощаващ, когато става въпрос за разделители на дати. Ето няколко валидни примера:
SELECT
YEAR('2045/12/10'),
YEAR('2045,12,10'),
YEAR('2045:12:10'),
YEAR('2045;12!10');
Резултат (с помощта на вертикален изход):
YEAR('2045/12/10'):2045YEAR('2045,12,10'):2045YEAR('2045:12:10'):2045YEAR('2045;12!10'):2045предварително>Текуща дата
Можем да предадем
NOW()
като аргумент datetime, за да използвате текущата дата:SELECT NOW(), YEAR(NOW());
Резултат:
<пред>+---------------------+------------+| СЕГА() | ГОДИНА(СЕГА()) |+---------------------+------------+| 17.10.2021 11:09:23 | 2021 |+---------------------+------------+
Невалидни аргументи
Когато се подаде невалиден аргумент, YEAR()
връща null
:
SELECT YEAR('2030-65-78');
Резултат:
+-------------------+| YEAR('2030-65-78') |+-------------------+| NULL |+-------------------+1 ред в комплект, 1 предупреждение (0,00 сек)
Проверете предупреждението:
SHOW WARNINGS;
Резултат:
+--------+------+---------------------------- -----------+| Ниво | Код | Съобщение |+--------+------+------------------------------ ----------+| Предупреждение | 1292 | Неправилна стойност за дата и час:'2030-65-78' |+---------+------+------------------- --------------------+
Липсващ аргумент
Извикване на YEAR()
с грешен брой аргументи или без подаване на аргументи, води до грешка:
SELECT YEAR();
Резултат:
ГРЕШКА 1064 (42000):Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на версията на вашия MySQL сървър за правилния синтаксис, който да използвате близо до ')' на ред 1
И още един пример:
SELECT YEAR('2030-12-10', '2031-12-10');
Резултат:
ГРЕШКА 1064 (42000):Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на версията на вашия MySQL сървър за правилния синтаксис, който да използвате близо до ', '2031-12-10')' на ред 1