mysql将日期转换为当年的同一日期

时间:2014-05-03 15:37:04

标签: mysql date

如何将日期列的年份替换为当前年份?

以下内容会返回NULL

SELECT str_to_date(concat(year(now()), '-',
month(datecolumn), '-' ,day(datecolumn)), '%Y-%M-%D')
FROM TABLE

2 个答案:

答案 0 :(得分:5)

Khalid的答案在大多数情况下是正确的。闰年搞砸了!例如,如果您运行建议的查询,其中datecol的值为“2016-02-29”且CURRENT_DATE为“2017-01-01”,则获得null

另一种更优雅地处理闰年的方法是:

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

此处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日之后的闰年的任何日期是365天的“正常”年份的日+ 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;

此方法将2月29日的任何一个变为28,否则将完全按照您的预期保留所有其他日期。解决方案的演示在这里:

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

答案 1 :(得分:1)

你可以这样做

SELECT 
CONCAT(YEAR(CURRENT_DATE()),RIGHT(datecol,15))  `date`
FROM t

Demo

或仅限日期

SELECT 
DATE_FORMAT(
CONCAT(YEAR(CURRENT_DATE()),RIGHT(datecol,15))
,'%Y-%m-%d')  `date`
FROM t

Demo 2