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

1l5u6lss  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(302)

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

2019-11-05 15:16:31

我想更新这些行,将日期组件从2019年11月5日更改为2020年6月8日,而不更改时间组件。我知道下面这只是一个数字值,没有年/月/日/小时/分/秒等的分隔。目的是使上述值变成:

2020-06-08 15:16:31

我能想到的最好办法是:

update mytable set tscolumn = tscolumn + 216

(当然有适当的where子句)
它可以工作,但不是特别漂亮,依赖于timeanddate.com

nnvyjq4y

nnvyjq4y1#

使用 TIMESTAMP literal,其中时间设置为午夜,然后将行中的时间分量相加,可以通过减去 TRUNC 从非截断列值中删除列值:

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<>在这里摆弄

yqlxgs2m

yqlxgs2m2#

一个选项使用日期艺术:

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'

相关问题