如何解决将所有日期更新为特定年份 - Oracle
我在 oracle 表日期字段中有以下日期数据:
3/5/2007
6/3/2008
1/12/2011
我只想将所有记录年份部分更新到 2020 年。因此输出将是:
3/5/2020
6/3/2020
1/12/2020
我尝试了以下操作,但这只会在所有源年份都相同的年份时更新,并且在我的情况下不起作用:
update my_table
set datefield = datefield + INTERVAL '2' YEAR
我想要某种以这种方式工作的更新语句(此示例不起作用):
update my_table
set datefield = mon(datefield) + day(datefield) + 2020
我在发帖前研究了这个问题。其他答案也参考了 add_months,在这种情况下似乎不起作用。
解决方法
您可以尝试将正确的年数添加到输入日期:
UPDATE my_table
SET datefield = ADD_MONTHS(datefield,12*(2020 - EXTRACT(year FROM datefield)));
因此,在 2007-05-03 的情况下,上面的 EXTRACT
计算会发现年差为 17,然后将正确的月数添加到 2003 以得出 2020 年.
这是一种方法 - 在日期格式模型中使用硬编码的子字符串。我将此应用于 sysdate
以进行说明,但这适用于任何日期表达式。
select sysdate,to_date (to_char(sysdate,'dd-mm-"2020" hh24:mi:ss'),'dd-mm-yyyy hh24:mi:ss') as same_date_time_in_2020
from dual;
SYSDATE SAME_DATE_TIME_IN_2020
-------------------- ----------------------
01-Mar-2021 07:36:25 01-Mar-2020 07:36:25
to_char()
返回转换为字符串的日期,但使用硬编码值 2020(用双引号括起来)而不是输入日期的年份部分。其余的 (to_date()
) 是微不足道的。
请注意,如果原始日期是 29-Feb
并且新年不是闰年,则使用这种方法会遇到问题。在这种情况下,您必须解释所需的处理方式。 Tim B 的答案也适用于这种情况 - 如果目标年份是非闰年,它只会将日期更改为 28-Feb
。
此外,如果您的日期“没有时间部分”(意思是,时间部分始终是午夜,00:00:00
,因为在 Oracle 日期中总是有时间部分),您可以简化公式 - 省略两种格式模型中的时间分量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。