更新当月的月份和年份,但请离开当天

时间:2017-11-20 14:39:24

标签: sql oracle date-arithmetic

我在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中。

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 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,但您的示例数据不一致。就个人而言,我会选择一种不会存在数据完整性问题风险的解决方案,因为明天的数据状态可能会与今天的状态不同。

Check out the LiveSQL demo

答案 2 :(得分:0)

我会从这样的事情开始,以获取我的日期,然后从中制作更新(用日期列替换old_date,用表名替换source_table):

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