【问题标题】:How to update day part of date in datetime column如何更新日期时间列中日期的日期部分
【发布时间】:2019-07-01 06:33:09
【问题描述】:

我只想更新表中所有记录的日期部分。例如,如果日期是16-AUG-18。我只想将16 的日期更新为15。该特定列中有数据,例如:

  • 16-AUG-16
  • 16-AUG-17
  • 17-AUG-18
  • 16-AUG-19
  • 17-AUG-20
  • 17-AUG-21

我只想更新这一天,让它像这样:

  • 15-AUG-16
  • 15-AUG-17
  • 15-AUG-18
  • 15-AUG-19
  • 15-AUG-20
  • 15-AUG-21

我使用 oracle 12C 作为数据库。日期格式为DD-MON-YY

【问题讨论】:

  • 你的意思是你只是想要前一天。
  • 不,可能有任何一天。我想把所有的都写成15
  • 使用正确的日期格式,YYYY-MM-DD。 (16-AUG-17 是指 2016-08-17 还是 2017-08-16?)
  • 它在DD-MMM-YY甲酸盐中。所以16-AUG-17 表示 2017 年 8 月 16 日
  • @DK Ansh Oracle 日期列没有格式;这正是您在转换查询结果以供显示时看到的内容。如前所述,避免使用YY,因为它不明确。

标签: sql oracle jdbc oracle-sqldeveloper


【解决方案1】:

我会保持简单。由于保证您的第 (15) 天* 出现在每个月,因此将日期替换为文字 15 应该是安全的,例如:

update mytable
set mydate = to_date( '15-' || to_char(mydate,'MM-YYYY'), 'DD-MM-YYYY')
where to_char(mydate,'DD') != '15';

警告:此更新将截断任何时间部分(至少对于那些尚未在每月 15 日的行)。

* 附注这在技术上并非适用于所有月份;不是每个月都有29、30、31;而在 1752 年 9 月,该月没有第 3 天到第 13 天(公历从第 3 天跳到第 14 天)。

【讨论】:

    【解决方案2】:

    很简单

    update your_Table
    set date_column= date_column-1;
    

    【讨论】:

    • 先看懂需求。
    【解决方案3】:

    我在自己创建的测试台上快速玩了一下。

    create table table_a 
    (col1 date);
    
    insert into table_a
    (col1)
    values
    (trunc(sysdate));
    
    insert into table_a
    (col1)
    values
    (trunc(sysdate + 10));
    
    insert into table_a
    (col1)
    values
    (trunc(sysdate - 10));
    
    
    commit;
    
    select * from table_a;
    
    The select below shows how to set the day to the 20th of the month
    
    select 
    col1 target_date,
    col1 + (20 - to_number(to_char(col1, 'dd'))) changed_date,
    20 - to_number(to_char(col1, 'dd')) factor_to_add
    from table_a;
    
    select * from table_a;
    
    TARGET_DA CHANGED_D FACTOR_TO_ADD
    --------- --------- -------------
    07-FEB-19 20-FEB-19            13
    17-FEB-19 20-FEB-19             3
    28-JAN-19 20-JAN-19            -8
    

    要在更新语句中使用它

    update your_table
    set your_column = col1 + (20 - to_number(to_char(col1, 'dd')));
    

    显然 - 将数字 20 更改为您要查找的月份中的任何一天。

    【讨论】:

      【解决方案4】:

      一种选择是逐个更新它们,例如

      update your_table set
        date_column = case when date_column = date '2016-08-16' then date '2016-08-15'
                           when date_column = date '2016-08-17' then date '2016-08-15'
                           else date_column
                      end;
      

      我不知道您的日期代表什么(例如,16-AUG-19day 是什么,year 是什么);你应该指定。

      或者,如果可能,您可以计算一个新日期

      update your_table set
        date_column = trunc(date_column, 'mm') + 14
      where date_column in (date '2016-08-16', date '2016-08-17');
      
      • 带有mm 格式掩码的TRUNC 返回该月的第一天。
      • 在第一天加上 14(天)将返回该月的 15 号

      例如:

      SQL> alter session set nls_date_format = 'dd.mm.yyyy';
      
      Session altered.
      
      SQL> select trunc(sysdate, 'mm') + 14 result from dual;
      
      RESULT
      ----------
      15.02.2019
      

      【讨论】:

      • 第一个解决方案不起作用。但对第二种解决方案印象深刻。
      • 但是第二个解决方案是否适用于我的,因为日期格式是DD-MMM-YY
      • 嗯,第一个解决方案工作,但它会是一个乏味的工作。如果第二个让你满意,那就更好了。
      • 截至 DD-MON-YY:如果列数据类型是 DATE,那么是的 - 它会工作,没问题。 DD-MON-YY 就是您看到那个日期的方式。
      【解决方案5】:

      我曾经喜欢过:

      UPDATE <Table_Name> SET DATE_COLM = CASE extract(DAY FROM DATE_COLM) WHEN 16 THEN DATE_COLM-1 WHEN 17 THEN DATE_COLM-2 END WHERE extract(MONTH FROM DATE_COLM) = 8 AND extract(DAY FROM DATE_COLM) > 15;
      

      但是有些我对这个查询不满意。我只是在寻找更有效的查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        相关资源
        最近更新 更多