如何更改 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
我有一个 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