我在 Oracle 数据库中遇到这种情况,我需要按照以下条件每月更新表中的一些日期:
1(如果表格中的日期类似于"03.06.2017"更新为"03.11.2017"
2(如果表中的日期像"29.06.2016"更新为"29.11.2017"
2(如果表格中的日期像"15.02.2016"更新为"15.11.2017"
所以基本上总是将日期(月,年(的一部分更新到当前月/年,但总是保持原样。
编辑:
不仅是 1 月 12 日的所有月份。我需要做这样的事情...更新表设置日期 = xx。(从系统日期开始的月份(。(自系统日期起的年份(哪里。。。xx(日(保留在数据库中的状态。
兄弟。
MONTHS_BETWEEN
来确定需要添加的月数,然后使用ADD_MONTHS
函数:
SQL 小提琴
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
结果:
| 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
可能你想要
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
但您的示例数据不同意。就我个人而言,我会选择一种不会冒数据完整性问题风险的解决方案,因为明天的数据状态可能与今天的状态不同。
查看 LiveSQL 演示。
我会从这样的东西开始获取我的日期,然后从中制作更新(用你的日期列替换old_date,用表名替换source_table(:
select old_date, to_char(sysdate, 'YYYY-MM-') || to_char(old_date, 'DD') from source_table;