如何用当前年份替换日期列中的年份?
以下收益 NULL
SELECT str_to_date(concat(year(now()), '-',
month(datecolumn), '-' ,day(datecolumn)), '%Y-%M-%D')
FROM TABLE
Run Code Online (Sandbox Code Playgroud)
大多数时候,哈立德的答案是正确的。年搞砸了!例如,如果您运行建议的查询,其中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
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |