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

mysql converte data para a mesma data do ano atual


A resposta de Khalid está correta na maioria das vezes. Ano bissexto bagunça as coisas! Se você executar a consulta proposta em que o valor de datecol é '2016-02-29' e CURRENT_DATE é '2017-01-01', por exemplo, você obtém null .

Uma maneira alternativa de fazer isso que lida com o ano bissexto de forma mais elegante é assim:
SELECT DATE_FORMAT(
    MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
    '%Y-%m-%d'
) `date`
FROM t

O valor de date aqui seria 2017-03-01.

Editar/esclarecimento:O problema é que alterar o ano de '2016-02-29' para 2017, por exemplo, produz '2017-02-29', que não é uma data válida. Em seguida, executar DATE_FORMAT('2017-02-29', '%Y-%m-%d') resulta em null . Uma demonstração do problema está aqui:

http://sqlfiddle.com/#!9/c5358/11

No entanto, depois de revisar minha resposta, percebi que havia outro problema usando MAKEDATE, pois qualquer data em um ano bissexto após 28 de fevereiro é dias + 1 para um ano "normal" com 365 dias. Por exemplo, se datecol ='2016-03-01' e o ano atual fosse 2017, a data convertida seria '2017-03-02', não '2017-03-01' conforme desejado. Uma abordagem melhor é a seguinte:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;

Esse método transforma qualquer dia 29 de fevereiro em 28 e mantém todas as outras datas exatamente como você esperaria. Uma demonstração da solução está aqui:

http://sqlfiddle.com/#!9/c5358/12