如何更改 Oracle 时间戳的日期组件

How can I change the date component of an Oracle timestamp

我有一个 Oracle TIMESTAMP 列,其中包含如下值:

2019-11-05 15:16:31

我想更新这些行以将日期部分从 2019 年 11 月 5 日更改为 2020 年 6 月 8 日,而不更改时间部分。我知道这下面只是一个数值,没有分隔 year/month/day/hour/minute/second/etc。目的是让上面的值变成:

2020-06-08 15:16:31

我能想到的最好的是:

update mytable set tscolumn = tscolumn + 216

(当然有适当的 where 子句)

哪个有效但不是特别漂亮并且依赖于 TimeAndDate.com

一个选项使用日期算法:

update mytable 
set tscolumn = tscolumn + (date '2020-06-08' - date '2019-11-05')
where tscolumn >= date '2019-11-05' and tscolumn < date '2019-11-06'

文字日期之间的减法给出了两者之间的天数。

请注意,我在查询中添加了一个 where 子句,因此它仅适用于日期部分为 '2019-11-05' 的列 - 不清楚您要对其他日期执行的操作。

如果你真的有一个 timestamp 列并且你想保留小数秒,那么你想使用间隔:

update mytable 
set tscolumn = tscolumn + (date '2020-06-08' - date '2019-11-05') * interval '1' day
where tscolumn >= date '2019-11-05' and tscolumn < date '2019-11-06'

在时间设置为午夜的地方使用 TIMESTAMP 文字,然后从您的行中添加时间部分,您可以通过从非截断的列值:

UPDATE mytable
SET tscolumn = TIMESTAMP '2020-06-08 00:00:00'
               + ( tscolumn - TRUNC( tscolumn ) ) DAY TO SECOND;

(包含 DAY TO SECOND 以便减法作为 INTERVAL 数据类型完成,而不是 Oracle 默认的数字差异。)

其中,对于示例数据:

CREATE TABLE mytable ( tscolumn ) AS
SELECT TIMESTAMP '2019-11-05 15:16:31' FROM DUAL;

输出:

| TSCOLUMN                      |
| :---------------------------- |
| 2020-06-08 15:16:31.000000000 |

db<>fiddle here