在Oracle中,如何从保留毫秒部分的时间戳中减去一个月

时间:2014-02-05 09:53:24

标签: sql oracle timestamp

在Oracle中,如何从保留毫秒部分的时间戳中减去一个月。

我正在使用add_months函数,但它正在截断毫秒。是否有内置函数或我必须手动提取时间戳的月份部分并添加到它?

1 个答案:

答案 0 :(得分:3)

您可以使用逐年间隔文字来完成它:

clear screen;

select current_timestamp                      as res_1
     , current_timestamp - interval '1' month as res_2
  from dual

结果:

RES_1                          RES_2                                
------------------------------ -----------------------------
05-FEB-14 02.02.32.383089000   05-JAN-14 02.02.32.383089000 

当您使用add_months()函数时,会发生数据类型转换 - timestamp数据类型的值变为date数据类型的值,该值没有小数秒。

由于@jonearles在对答案的评论中绝对正确地指出,使用上述方法从保留毫秒的timestamp数据类型的给定值中减去一个或多个月,可能会导致ORA-01839: date not valid for month specified

为了防止弹出该错误,可以按如下方式重写查询:

clear screen;

with t1(col) aS(
  select current_timestamp                     from dual union all
  select timestamp '2000-03-30 12:12:12.123'   from dual union all
  select timestamp '2014-03-30 01:12:59.64567' from dual 
)
select col as cur                                    
     , cast(add_months(col, -1) as timestamp) + (col - cast(col as date)) as prev
  from t1

结果:

CUR                                    PREV                          
-------------------------------------- -------------------------------
14-FEB-14 01.45.46.344187000 PM        14-JAN-14 01.45.46.344187000 PM  
30-MAR-00 12.12.12.123000000 PM        29-FEB-00 12.12.12.123000000 PM 
30-MAR-14 01.12.59.645670000 AM        28-FEB-14 01.12.59.645670000 AM