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



我在 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;

最新更新