【问题标题】:How can I change the date component of an Oracle timestamp如何更改 Oracle 时间戳的日期部分
【发布时间】:2020-09-28 11:06:49
【问题描述】:

我有一个 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

【问题讨论】:

  • 您不喜欢您的解决方案的哪些方面?
  • 我不喜欢我必须依靠先去 timeAndDate 来找出天数的事实。我宁愿一个更明确的解决方案。

标签: sql oracle date oracle11g timestamp


【解决方案1】:

一个选项使用日期算法:

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 + NUMBER 不是受支持的操作,因此 Oracle 会将其隐式转换为 CAST( tscolumn AS DATE ) + (date '2020-06-08' - date '2019-11-05'),您将丢失时间组件中的小数秒。鉴于 OP 使用的是 TIMESTAMP 数据类型而不是 DATE (它也有一个时间组件,只是没有小数秒),那么这可能是正在丢失的重要数据。 db<>fiddle
  • @MT0:是的,这很好。我没有注意到这一点,因为 OP 首先是在进行 + number 操作......但确实他们说他们有一个 timestamp 列。我编辑了我的答案;
【解决方案2】:

在时间设置为午夜时使用TIMESTAMP 文字,然后从行中添加时间分量,您可以通过从非截断列值中减去TRUNCated 列值来计算:

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;

输出:

|专栏 | | :---------------------------- | | 2020-06-08 15:16:31.000000000 |

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多