将月份和年份更新为当前但离开日期
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
但您的样本数据不同意。就我个人而言,我会选择不会 运行 数据完整性问题风险的解决方案,因为明天的数据状态可能与今天的状态不同。
您可以使用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
| 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;
我在 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
但您的样本数据不同意。就我个人而言,我会选择不会 运行 数据完整性问题风险的解决方案,因为明天的数据状态可能与今天的状态不同。
您可以使用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
| 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;