如何在日期时间列中更新日期的日期部分

时间:2019-02-07 07:30:58

标签: sql oracle

我只想为表中的所有记录更新日期的一天部分。例如,如果日期为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

的格式

5 个答案:

答案 0 :(得分:1)

一个选项是将其一次更新,例如

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-19中的 day year 是什么);您应该指定它。

或者,如果可能的话,您可以计算新日期为

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

答案 1 :(得分:0)

我曾经这样:

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;

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

答案 2 :(得分:0)

我在创建的测试台上进行了快速播放。

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更改为您要查找的月份中的任意一天。

答案 3 :(得分:0)

非常简单

update your_Table
set date_column= date_column-1;

答案 4 :(得分:0)

我会保持简单。由于保证您的一天(15)*存在于每个月中,因此只需将日期替换为文字15就可以了,例如:

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

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

* p.s。从技术上讲,并非所有月份都适用;每月不存在29、30、31;并且在1752年9月,该月没有3到13天(公历从3日跳到14日)。