如何将日期列的年份替换为当前年份?
以下内容会返回NULL
SELECT str_to_date(concat(year(now()), '-',
month(datecolumn), '-' ,day(datecolumn)), '%Y-%M-%D')
FROM TABLE
答案 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,否则将完全按照您的预期保留所有其他日期。解决方案的演示在这里:
答案 1 :(得分:1)