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

mysql converte la data nella stessa data dell'anno in corso

La risposta di Khalid è corretta la maggior parte delle volte. L'anno bisestile rovina le cose! Se esegui la query proposta in cui il valore di datecol è '2016-02-29' e CURRENT_DATE è '2017-01-01', ad esempio, ottieni null .

Un modo alternativo per farlo che gestisce l'anno bisestile con maggiore grazia è questo:

SELECT DATE_FORMAT(
    MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
    '%Y-%m-%d'
) `date`
FROM t

Il valore di date qui sarebbe il 01-03-2017.

Modifica/chiarimento:il problema è che cambiando l'anno da "2016-02-29" a 2017, ad esempio, si ottiene "2017-02-29", che non è una data valida. Quindi, eseguendo DATE_FORMAT('2017-02-29', '%Y-%m-%d') risulta null . Una demo del problema è qui:

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

Tuttavia, dopo aver esaminato la mia risposta, mi sono reso conto che ho un altro problema utilizzando MAKEDATE poiché qualsiasi data di un anno bisestile dopo il 28 febbraio è giorni + 1 per un anno "normale" con 365 giorni. Ad esempio, se datecol ='2016-03-01' e l'anno corrente fosse il 2017, la data convertita sarebbe '2017-03-02', non '2017-03-01' come desiderato. Un approccio migliore è il seguente:

SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;

Questo metodo trasforma qualsiasi 29 febbraio in 28, e altrimenti mantiene tutte le altre date esattamente come ti aspetteresti. Una demo della soluzione è qui:

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