In MySQL, YEAR()
è una funzione di data e ora incorporata che restituisce l'anno da una determinata espressione di data.
Restituisce l'anno come numero nell'intervallo 1000
a 9999
. Per zero date, potrebbe restituire 0
o NULL
con un avviso, a seconda dei valori nel tuo sql_mode
.
Sintassi
La sintassi è questa:
YEAR(date)
Dove date
è l'espressione della data da cui ottenere l'anno.
Esempio
Ecco un esempio:
SELECT YEAR('2045-12-10');
Risultato:
2045
Valori di data e ora
Funziona anche con i valori datetime:
SELECT YEAR('2045-12-10 18:52:17');
Risultato:
2045
Zero date
Secondo la documentazione di MySQL, zero date risulta in 0
. Tuttavia, il risultato effettivo dipenderà dal valore del tuo sql_mode
variabile di sistema.
Per impostazione predefinita, le date zero non sono consentite e, pertanto, le seguenti operazioni producono NULL
con un avviso:
SELECT YEAR('0000-00-00');
Risultato:
+--------------------+ | YEAR('0000-00-00') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
Ed ecco l'avviso:
show warnings;
Risultato:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+
Ho ricevuto questo avviso perché il mio sql_mode
la variabile di sistema include NO_ZERO_DATE
e NO_ZERO_IN_DATE
:
SELECT @@SESSION.sql_mode;
Risultato:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Resettiamo il mio sql_mode
senza quei valori:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode;
Risultato:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Ora eseguiamo YEAR()
funzione di nuovo con la data zero:
SELECT YEAR('0000-00-00');
Risultato:
0
Questa volta otteniamo 0
, come da documentazione.
Nota che NO_ZERO_DATE
e NO_ZERO_IN_DATE
sono deprecati al momento della scrittura. Pertanto, potrebbero essere rimossi in qualsiasi momento.
Date numeriche
È anche possibile trasmettere le date come numero, purché abbia senso come data.
Esempio:
SELECT YEAR(20451210);
Risultato:
2045
O anche il seguente (che utilizza un anno a due cifre):
SELECT YEAR(451210);
Risultato:
2045
Ma deve avere un senso come appuntamento. Ecco cosa succede se aumento la parte del giorno a un giorno non valido:
SELECT YEAR(20451265);
Risultato:
+----------------+ | YEAR(20451265) | +----------------+ | NULL | +----------------+ 1 row in set, 1 warning (0.00 sec)
Possiamo controllare l'avviso in questo modo:
show warnings;
Risultato:
+---------+------+--------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------+ | Warning | 1292 | Incorrect datetime value: '20451265' | +---------+------+--------------------------------------+
Altri delimitatori
È possibile utilizzare altri delimitatori per la data. MySQL è abbastanza clemente quando si tratta di delimitatori sulle date. Ecco alcuni validi esempi:
SELECT
YEAR('2045/12/10'),
YEAR('2045,12,10'),
YEAR('2045:12:10'),
YEAR('2045;12!10');
Risultato (usando l'output verticale):
YEAR('2045/12/10'): 2045 YEAR('2045,12,10'): 2045 YEAR('2045:12:10'): 2045 YEAR('2045;12!10'): 2045
Data attuale
Possiamo passare NOW()
come argomento datetime per utilizzare la data corrente:
SELECT
NOW(),
YEAR(NOW());
Risultato:
+---------------------+-------------+ | NOW() | YEAR(NOW()) | +---------------------+-------------+ | 2021-10-17 11:09:23 | 2021 | +---------------------+-------------+
Argomenti non validi
Quando viene passato un argomento non valido, YEAR()
restituisce null
:
SELECT YEAR('2030-65-78');
Risultato:
+--------------------+ | YEAR('2030-65-78') | +--------------------+ | NULL | +--------------------+ 1 row in set, 1 warning (0.00 sec)
Controlla l'avviso:
SHOW WARNINGS;
Risultato:
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '2030-65-78' | +---------+------+----------------------------------------+
Argomento mancante
Chiamando YEAR()
con il numero errato di argomenti, o senza passare alcun argomento, si verifica un errore:
SELECT YEAR();
Risultato:
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
E un altro esempio:
SELECT YEAR('2030-12-10', '2031-12-10');
Risultato:
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