【问题标题】:Update all dates to a specific year - Oracle将所有日期更新为特定年份 - Oracle
【发布时间】:2021-05-31 03:17:51
【问题描述】:

我在 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 在这种情况下似乎不起作用。

【问题讨论】:

    标签: oracle oracle11g oracle10g oracle-sqldeveloper


    【解决方案1】:

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

    UPDATE my_table
    SET datefield = ADD_MONTHS(datefield, 12*(2020 - EXTRACT(year FROM datefield)));
    

    因此,在 2007-05-03 的情况下,上面的 EXTRACT 计算将找到 17 作为年差,然后将正确的月数添加到 2003 以将年份调到 2020。

    【讨论】:

      【解决方案2】:

      这是一种方法 - 在日期格式模型中使用硬编码子字符串。我将此应用于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 日期总是有时间组件),您可以简化公式 - 在两种格式模型中都省略了时间分量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-20
        • 2017-01-19
        • 2012-03-07
        • 1970-01-01
        • 2023-03-05
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多