在Oracle中,如何从保留毫秒部分的时间戳中减去一个月。
我正在使用add_months
函数,但它正在截断毫秒。是否有内置函数或我必须手动提取时间戳的月份部分并添加到它?
答案 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