将所有日期更新到特定年份-Oracle

将所有日期更新到特定年份-Oracle,oracle,oracle11g,oracle10g,oracle-sqldeveloper,Oracle,Oracle11g,Oracle10g,Oracle Sqldeveloper,我在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语句以这种方式工作(此示例不起作用): 我在发布

我在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语句以这种方式工作(此示例不起作用):


我在发布之前研究了这个问题。其他答案也涉及添加月份,在这种情况下似乎不起作用。

您可以尝试将正确的年数添加到输入日期:

更新我的表格
SET datefield=ADD_MONTHS(日期字段,12*(2020年-提取日期字段的年份));

因此,在2007-05-03的情况下,上面的
提取
计算结果将发现17年为年差,然后将正确的月数添加到2003年,以将年份推迟到2020年。

您可以尝试将正确的年数添加到输入日期:

更新我的表格
SET datefield=ADD_MONTHS(日期字段,12*(2020年-提取日期字段的年份));

因此,在2007-05-03的情况下,上面的
提取计算将发现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(用双引号括起来),而不是输入日期的年份部分。其余的(
到_date()
)都是微不足道的

请注意,如果原始日期是2月29日,而新年不是闰年,则使用这种方法会遇到麻烦。在这种情况下,您必须解释所需的处理是什么。Tim B的答案在这种情况下也会起作用——如果目标年是非闰年,它只会将日期更改为2月28日


此外,如果您的日期“没有时间成分”(意思是时间成分总是午夜,
00:00:00
,就像Oracle日期总是有时间成分一样),您可以简化公式-在两种格式模型中都省去时间成分。

这里有一种方法-在日期格式模型中使用硬编码的子字符串。我将其应用于
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(用双引号括起来),而不是输入日期的年份部分。其余的(
到_date()
)都是微不足道的

请注意,如果原始日期是2月29日,而新年不是闰年,则使用这种方法会遇到麻烦。在这种情况下,您必须解释所需的处理是什么。Tim B的答案在这种情况下也会起作用——如果目标年是非闰年,它只会将日期更改为2月28日

此外,如果您的日期“没有时间成分”(意思是,时间成分总是午夜,
00:00:00
,就像Oracle日期总是有时间成分一样),您可以简化公式-在两种格式模型中都省去时间成分