如何在 PL/SQL 中将一纳秒添加到时间戳

Posted

技术标签:

【中文标题】如何在 PL/SQL 中将一纳秒添加到时间戳【英文标题】:How to add one nanosecond to a timestamp in PL/SQL 【发布时间】:2013-11-08 18:49:13 【问题描述】:

我正在尝试将纳秒添加到 timestamp 变量,但没有任何运气。

这是示例代码:

DECLARE
  lts_nextTimestamp TIMESTAMP = TO_TIMESTAMP('11-11-2013 22:10:10:111111111');
  ;
BEGIN
  lts_nextTimestamp := lts_nextTimestamp + 1 / (10000000*60*60*24)
END;

知道我该怎么做吗?

【问题讨论】:

我不明白你为什么要这样做。如果您需要保存记录的时间戳,请使用真实(当前)值。如果您需要对同时发生的记录进行排序,请使用单独的 seq_no 字段。 我需要它用于寻呼系统;) 【参考方案1】:

interval day to second 文字可用于将小数秒添加到时间戳值:

在本例中,我们添加一纳秒:

select timestamp '2013-11-11 22:10:10.111111111' + 
       interval '0 00:00:00.000000001' day to second(9) as res
  from dual

结果:

RES                           
-------------------------------
11-NOV-13 10.10.10.111111112 PM 

注意:当您使用to_timestamp() 函数将字符文字转换为时间戳数据类型的值时,最好指定格式掩码(而不是在 NLS 设置上中继)。

select TO_TIMESTAMP('11-11-2013 22:10:10:111111111', 'dd-mm-yyyy hh24:mi:ss:ff9') + 
       interval '0 00:00:00.000000001' day to second(9) as res
  from dual

结果:

RES                           
-------------------------------
11-NOV-13 10.10.10.111111112 PM 

注意:当您打算使用 PL/SQL 处理时间戳数据类型的值时,您应该注意以下几点。在 PL/SQL 中,timestamp 数据类型值的默认小数秒精度是 6 而不是 SQL 中的 9,因此您可能期望截断小数秒。为了避免截断小数秒,请使用 timestamp_unconstraineddsinterval_unconstrained 数据类型,而不是 timestampinterval day to second

declare
  l_tmstmp timestamp_unconstrained := to_timestamp('11-11-2013 22:10:10:111111111',
                                                   'dd-mm-yyyy hh24:mi:ss:ff9');
  l_ns     dsinterval_unconstrained :=  interval '0.000000001' second;
begin
  l_tmstmp := l_tmstmp + l_ns;
  dbms_output.put_line(to_char(l_tmstmp, 'dd-mm-yyyy hh24:mi:ss:ff9'));
end;

结果:

anonymous block completed
11-11-2013 22:10:10:111111112

【讨论】:

稍微短一点的方法是:interval '0.000000001' second

以上是关于如何在 PL/SQL 中将一纳秒添加到时间戳的主要内容,如果未能解决你的问题,请参考以下文章

将日期添加到时间戳

将浮点列添加到时间戳类型列(秒+毫秒)

石墨——如何将数据发送到时间戳超过一年的碳

如果时间戳不存在,有没有办法将秒添加到时间戳中?

js 怎么取到时间戳里面的月份?

将 SQL Server 中 datetime 字段的默认值添加到时间戳