mysql将日期转换为当前年份的相同日期

and*_*rew 2 mysql date

如何用当前年份替换日期列中的年份?

以下收益 NULL

SELECT str_to_date(concat(year(now()), '-',
month(datecolumn), '-' ,day(datecolumn)), '%Y-%M-%D')
FROM TABLE
Run Code Online (Sandbox Code Playgroud)

rec*_*eps 5

大多数时候,哈立德的答案是正确的。年搞砸了!例如,如果您运行建议的查询,其中datecol的值为“ 2016-02-29”,而CURRENT_DATE为“ 2017-01-01”,则得到null

另一种更优雅地处理leap年的方式是这样的:

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

date这里的值将是2017-03-01。

编辑/说明:问题是,例如,将'2016-02-29'的年份更改为2017,会产生'2017-02-29',这不是有效的日期。然后,运行DATE_FORMAT('2017-02-29','%Y-%m-%d')会导致null。问题的演示在这里:

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

但是,在查看了答案之后,我意识到我使用MAKEDATE遇到了另一个问题,因为2月28日之后的a年中的任何日期都是365天的“正常”年份的days + 1。例如,如果datecol ='2016-03-01'且当前年份为2017,则转换的日期将为'2017-03-02',而不是所需的'2017-03-01'。更好的方法如下:

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

此方法会将2月29日转换为28,否则将所有其他日期保留为您期望的日期。解决方案的演示在这里:

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