Mysql
 sql >> Database >  >> RDS >> Mysql

YEAR() Esempi – MySQL

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