Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

YEAR() Exemplos – MySQL


No MySQL, YEAR() é uma função interna de data e hora que retorna o ano de uma determinada expressão de data.

Ele retorna o ano como um número no intervalo 1000 para 9999 . Para datas zero, poderia retornar 0 ou NULL com um aviso, dependendo dos valores em seu sql_mode .

Sintaxe


A sintaxe fica assim:
YEAR(date) 

Onde date é a expressão de data da qual obter o ano.

Exemplo


Aqui está um exemplo:
SELECT YEAR('2045-12-10'); 

Resultado:
2045

Valores de data e hora


Também funciona com valores de data e hora:
SELECT YEAR('2045-12-10 18:52:17'); 

Resultado:
2045

Zero Datas


De acordo com a documentação do MySQL, datas zero resultam em 0 . No entanto, o resultado real dependerá do valor do seu sql_mode variável do sistema.

Por padrão, datas zero não são permitidas e, portanto, fazer o seguinte produz NULL com um aviso:
SELECT YEAR('0000-00-00'); 

Resultado:
+--------------------+| ANO('0000-00-00') |+--------------------+| NULL |+--------------------+1 linha no conjunto, 1 aviso (0,00 seg)

E aqui fica o aviso:
show warnings; 

Resultado:
+---------+------+----------------------------- -----------+| Nível | Código | Mensagem |+---------+------+------------------- ----------+| Aviso | 1292 | Valor de data e hora incorreto:'0000-00-00' |+---------+------+-------------------- --------------------+

Recebi este aviso porque meu sql_mode variável de sistema inclui NO_ZERO_DATE e NO_ZERO_IN_DATE :
SELECT @@SESSION.sql_mode; 

Resultado:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Vamos redefinir meu sql_mode sem esses valores:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@SESSION.sql_mode; 

Resultado:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Agora vamos executar o YEAR() função novamente com a data zero:
SELECT YEAR('0000-00-00'); 

Resultado:
0

Desta vez temos 0 , conforme a documentação.

Observe que NO_ZERO_DATE e NO_ZERO_IN_DATE estão obsoletos no momento da escrita. Portanto, eles podem ser removidos a qualquer momento.

Datas numéricas


Também é possível passar datas como um número, desde que faça sentido como uma data.

Exemplo:
SELECT YEAR(20451210); 

Resultado:
2045

Ou mesmo o seguinte (que usa um ano de dois dígitos):
SELECT YEAR(451210); 

Resultado:
2045

Mas deve fazer sentido como uma data. Veja o que acontece se eu aumentar a parte do dia para um dia inválido:
SELECT YEAR(20451265); 

Resultado:
+----------------+| ANO(20451265) |+----------------+| NULL |+----------------+1 linha no conjunto, 1 aviso (0,00 seg)

Podemos verificar o aviso assim:
show warnings; 

Resultado:
+---------+------+----------------------------- ---------+| Nível | Código | Mensagem |+---------+------+------------------- --------+| Aviso | 1292 | Valor de data e hora incorreto:'20451265' |+---------+------+------------------------ --------------+

Outros delimitadores


Você pode usar outros delimitadores para a data. O MySQL é bastante tolerante quando se trata de delimitadores de datas. Aqui estão alguns exemplos válidos:
SELECT 
    YEAR('2045/12/10'),
    YEAR('2045,12,10'),
    YEAR('2045:12:10'),
    YEAR('2045;12!10'); 

Resultado (usando saída vertical):
YEAR('2045/12/10'):2045YEAR('2045,12,10'):2045YEAR('2045:12:10'):2045YEAR('2045;12!10'):2045 

Data atual


Podemos passar NOW() como argumento datetime para usar a data atual:
SELECT 
    NOW(),
    YEAR(NOW()); 

Resultado:
+----------+-------------+| AGORA() | ANO(AGORA()) |+---------------------+-------------+| 17/10/2021 11:09:23 | 2021 |+---------------------+-------------+

Argumentos inválidos


Quando passado um argumento inválido, YEAR() retorna null :
SELECT YEAR('2030-65-78'); 

Resultado:
+--------------------+| ANO('2030-65-78') |+--------------------+| NULL |+--------------------+1 linha no conjunto, 1 aviso (0,00 seg)

Confira o aviso:
SHOW WARNINGS; 

Resultado:
+---------+------+----------------------------- -----------+| Nível | Código | Mensagem |+---------+------+------------------- ----------+| Aviso | 1292 | Valor de data e hora incorreto:'2030-65-78' |+---------+------+-------------------- --------------------+

Argumento ausente


Chamando YEAR() com o número errado de argumentos, ou sem passar nenhum argumento, resulta em um erro:
SELECT YEAR(); 

Resultado:
ERRO 1064 (42000):Você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta para usar perto de ')' na linha 1

E outro exemplo:
SELECT YEAR('2030-12-10', '2031-12-10'); 

Resultado:
ERRO 1064 (42000):Você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta a ser usada perto de ', '2031-12-10')' na linha 1