W MySQL, YEAR()
to wbudowana funkcja daty i czasu, która zwraca rok z podanego wyrażenia daty.
Zwraca rok jako liczbę z zakresu 1000
do 9999
. Dla dat zerowych może zwrócić 0
lub NULL
z ostrzeżeniem, w zależności od wartości w Twoim sql_mode
.
Składnia
Składnia wygląda tak:
YEAR(date)
Gdzie date
jest wyrażeniem daty, z którego pochodzi rok.
Przykład
Oto przykład:
SELECT YEAR('2045-12-10');
Wynik:
2045
Wartości daty i godziny
Działa również z wartościami daty i godziny:
SELECT YEAR('2045-12-10 18:52:17');
Wynik:
2045
Zero dat
Zgodnie z dokumentacją MySQL zero dat daje w wyniku 0
. Jednak rzeczywisty wynik będzie zależał od wartości twojego sql_mode
zmienna systemowa.
Domyślnie daty zerowe nie są dozwolone, dlatego wykonanie następujących czynności daje NULL
z ostrzeżeniem:
SELECT YEAR('0000-00-00');
Wynik:
+--------------------+ | YEAR('0000-00-00') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
A oto ostrzeżenie:
show warnings;
Wynik:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+
Otrzymałem to ostrzeżenie, ponieważ mój sql_mode
zmienna systemowa zawiera NO_ZERO_DATE
i NO_ZERO_IN_DATE
:
SELECT @@SESSION.sql_mode;
Wynik:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Zresetujmy mój sql_mode
bez tych wartości:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode;
Wynik:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Teraz uruchommy YEAR()
funkcja ponownie z datą zerową:
SELECT YEAR('0000-00-00');
Wynik:
0
Tym razem otrzymujemy 0
, zgodnie z dokumentacją.
Pamiętaj, że NO_ZERO_DATE
i NO_ZERO_IN_DATE
są przestarzałe w momencie pisania. Dlatego można je usunąć w dowolnym momencie.
Daty numeryczne
Możliwe jest również przekazywanie dat jako liczby, o ile ma to sens jako data.
Przykład:
SELECT YEAR(20451210);
Wynik:
2045
Lub nawet następujący (który używa dwucyfrowego roku):
SELECT YEAR(451210);
Wynik:
2045
Ale to musi mieć sens jako randka. Oto, co się stanie, jeśli zwiększę część dnia do nieprawidłowego dnia:
SELECT YEAR(20451265);
Wynik:
+----------------+ | YEAR(20451265) | +----------------+ | NULL | +----------------+ 1 row in set, 1 warning (0.00 sec)
Możemy sprawdzić ostrzeżenie w następujący sposób:
show warnings;
Wynik:
+---------+------+--------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------+ | Warning | 1292 | Incorrect datetime value: '20451265' | +---------+------+--------------------------------------+
Inne ograniczniki
Możesz użyć innych ograniczników daty. MySQL jest dość wyrozumiały, jeśli chodzi o ograniczniki dat. Oto kilka poprawnych przykładów:
SELECT
YEAR('2045/12/10'),
YEAR('2045,12,10'),
YEAR('2045:12:10'),
YEAR('2045;12!10');
Wynik (przy użyciu wyjścia pionowego):
YEAR('2045/12/10'): 2045 YEAR('2045,12,10'): 2045 YEAR('2045:12:10'): 2045 YEAR('2045;12!10'): 2045
Aktualna data
Możemy przekazać NOW()
jako argument datetime, aby użyć bieżącej daty:
SELECT
NOW(),
YEAR(NOW());
Wynik:
+---------------------+-------------+ | NOW() | YEAR(NOW()) | +---------------------+-------------+ | 2021-10-17 11:09:23 | 2021 | +---------------------+-------------+
Nieprawidłowe argumenty
Po przekazaniu nieprawidłowego argumentu YEAR()
zwraca null
:
SELECT YEAR('2030-65-78');
Wynik:
+--------------------+ | YEAR('2030-65-78') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
Sprawdź ostrzeżenie:
SHOW WARNINGS;
Wynik:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '2030-65-78' | +---------+------+----------------------------------------+
Brakujący argument
Wywołanie YEAR()
z niewłaściwą liczbą argumentów lub bez przekazywania jakichkolwiek argumentów powoduje błąd:
SELECT YEAR();
Wynik:
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
I kolejny przykład:
SELECT YEAR('2030-12-10', '2031-12-10');
Wynik:
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