我在Oracle DB中有这样的情况,我需要在这个条件下每月更新表中的一些日期:
1)如果表格中的日期类似于' 03.06.2017'更新至' 03.11.2017'
2)如果表中的日期类似于' 29.06.2016'更新至' 2017年11月29日'
2)如果表中的日期类似于< 15.02.2016'更新至' 15.11.2017'
所以基本上总是将日期(月,年)的一部分更新为当前月/年,但总是保持原样。
编辑:
所有月份都是1-12,而不仅仅是6月。我需要做这样的事情... UPDATE表SET date = xx。(来自sysdate的月份)。(来自sysdate的年份)WHERE ... xx(day)离开,因为它在DB中。
溴
答案 0 :(得分:3)
您可以使用MONTHS_BETWEEN
确定需要添加的月数,然后使用ADD_MONTHS
功能:
Oracle 11g R2架构设置:
CREATE TABLE dates ( value ) AS
SELECT DATE '2017-06-03' FROM DUAL UNION ALL
SELECT DATE '2016-06-29' FROM DUAL UNION ALL
SELECT DATE '2016-02-15' FROM DUAL UNION ALL
SELECT DATE '2016-03-31' FROM DUAL;
<强>更新强>:
UPDATE dates
SET value = ADD_MONTHS(
value,
CEIL( MONTHS_BETWEEN( TRUNC( SYSDATE, 'MM' ), value ) )
);
查询1 :
SELECT * FROM dates
<强> Results 强>:
| VALUE |
|----------------------|
| 2017-11-03T00:00:00Z |
| 2017-11-29T00:00:00Z |
| 2017-11-15T00:00:00Z |
| 2017-11-30T00:00:00Z | -- There are not 31 days in November
答案 1 :(得分:2)
可能你想要
update your_table
set this_date = add_months(this_date, 5)
where ...
这将在所选日期增加五个月。
您编辑过的问题表示您要将所有日期更新为当前月份和年份;你可以像这样自动化......
update your_table
set this_date = add_months(this_date,
months_between(trunc(sysdate,'mm'), trunc(this_date, 'mm')))
-- or whatever filter you require
where this_date between trunc(sysdate, 'yyyy') and sysdate
/
使用month_between()
可确保您不会收到无效日期,例如“2017-11-31”。您在评论中说所有日期都是< 05.mm.yyyy
,但您的示例数据不一致。就个人而言,我会选择一种不会存在数据完整性问题风险的解决方案,因为明天的数据状态可能会与今天的状态不同。
答案 2 :(得分:0)
我会从这样的事情开始,以获取我的日期,然后从中制作更新(用日期列替换old_date,用表名替换source_table):
select old_date, to_char(sysdate, 'YYYY-MM-') || to_char(old_date, 'DD') from source_table;