将2个月添加到当前时间戳

时间:2013-01-11 21:24:38

标签: sql oracle date date-arithmetic

如何在Oracle中为时间戳值添加月份?在我的查询中,它将转换为日期值:

     SELECT add_months(current_timestamp,2) 
     FROM   dual;

实际输出是:

     ADD_MONTH
     11-MAR-13

预期输出为:

    2013-01-01 00:00:00.000000000+00:00

5 个答案:

答案 0 :(得分:1)

这将为您提供日期和时间作为TIMESTAMP数据类型:

select TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSDATE, 2), 'YYYYMMDD HH24:MI'), 
'YYYYMMDD HH24:MI') from dual;

如果您需要比上述更高或更低的精度(E.G.舍入),请调整日期格式(两者都需要采用相同的格式)。例如,这将返回2个月到秒的精度级别:

select TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSTIMESTAMP, 2), 
'YYYYMMDD HH24:MI:SS'), 'YYYYMMDD HH24:MI:SS') from dual;

这是我能够获得的最接近您所需格式的字符:

select TO_CHAR( 
TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSTIMESTAMP, 2), 
'YYYYMMDD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS'),
'YYYY-MM-DD HH24:MI:SS.FF TZR') from dual;

答案 1 :(得分:1)

对于Oracle:

SELECT
  TIMESTAMP'2014-01-30 08:16:32',                                  -- TS we want to increase by 1 month
--TIMESTAMP'2014-01-30 08:16:32' + NUMTOYMINTERVAL(1, 'MONTH'),    -- raises ORA-01839: date not valid for month specified
--TIMESTAMP'2014-01-30 08:16:32' + INTERVAL '1' MONTH,             -- raises ORA-01839: date not valid for month specified
  ADD_MONTHS(TIMESTAMP'2014-01-30 08:16:32', 1),                   -- works but is a date :(
  CAST(ADD_MONTHS(TIMESTAMP'2014-01-30 08:16:32', 1) AS TIMESTAMP) -- works
FROM DUAL

答案 2 :(得分:0)

我认为这会给你提供你想要的东西:

SELECT TO_CHAR(TO_TIMESTAMP(ADD_MONTHS(CURRENT_TIMESTAMP,2))
            + (CURRENT_TIMESTAMP - TRUNC(CURRENT_TIMESTAMP)),
       'YYYY-MM-DD HH:MI:SSxFFTZR') FROM DUAL;

使用区间方法的问题是,您可能会遇到意外错误,具体取决于您运行查询的日期。 E.g。

SELECT TO_TIMESTAMP('31-JAN-2012') + NUMTOYMINTERVAL(1,'MONTH') FROM DUAL;

该查询返回:

ORA-01839: date not valid for month specified

这是因为它试图返回2月31日,这不是有效日期。

ADD_MONTHS是一种“更安全”的数学日期方法,因为在上面的例子中,间隔查询会引发错误,ADD_MONTHS将返回该月的最后一个日期(2月28日或29日,具体取决于年份)。

答案 3 :(得分:-1)

对于Oracle:

select TO_TIMESTAMP(Sysdate,'DD-Mon-YYYY HH24-MI-SS') + 60
from dual;

select sysdate + interval '2' month from dual;

select TO_TIMESTAMP (Sysdate + interval '2' month,  'DD-Mon-YYYY HH24-MI-SS')
from dual
;

结果1:

| TO_TIMESTAMP(SYSDATE,'DD-MON-YYYYHH24-MI-SS')+60 |
----------------------------------------------------
|                     March, 12 0013 00:00:00+0000 |

结果2:

|     SYSDATE+INTERVAL'2'MONTH |
--------------------------------
| March, 11 2013 21:41:10+0000 |

Result3:

| TO_TIMESTAMP(SYSDATE+INTERVAL'2'MONTH,'DD-MON-YYYYHH24-MI-SS') |
------------------------------------------------------------------
|                                   March, 11 0013 00:00:00+0000 |

答案 4 :(得分:-1)

SELECT current_timestamp + INTERVAL '2' MONTH from dual;

要以所需格式显示,请使用TO_CHAR

SELECT TO_CHAR(current_timestamp + INTERVAL '2' MONTH, 
       'YYYY-MM-DD HH24:MI:SS.FF9TZH:TZM') from dual;
2013-03-11 23:58:14.789501000+01:00