我只想为表中的所有记录更新日期的一天部分。例如,如果日期为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
答案 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
返回该月的第一天。例如:
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日)。