将月份和年份更新为当前但离开日期

UPDATE month and year to current but leave day

我在 Oracle DB 中遇到这种情况,我需要每月更新 table 中的某些日期,遵循以下条件:

1) 如果 table 中的日期像“03.06.2017”更新为“03.11.2017”

2) 如果 table 中的日期如“29.06.2016”更新为“29.11.2017”

2) 如果 table 中的日期像“15.02.2016”更新为“15.11.2017”

所以基本上总是将日期(月,年)的一部分更新为当前 month/year 但始终保持原样。

编辑:

不仅是六月,还有 1-12 日的所有月份。我需要做这样的事情... UPDATE table SET date = xx.(month from sysdate).(year from sysdate) WHERE... xx (day) leave as it is in DB.

Br.

可能你想要

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 但您的样本数据不同意。就我个人而言,我会选择不会 运行 数据完整性问题风险的解决方案,因为明天的数据状态可能与今天的状态不同。

Check out the LiveSQL demo.

您可以使用MONTHS_BETWEEN来确定您需要添加多少个月,然后使用ADD_MONTHS函数:

SQL Fiddle

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

我会从类似这样的东西开始获取我的日期,然后从中制作更新(用你的日期列替换 old_date,用 table 名称替换 source_table) :

select old_date, to_char(sysdate, 'YYYY-MM-') || to_char(old_date, 'DD') from source_table;