In addition to add_months, you can also use interval:
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 <br/> connected as xxpo </P> <p> SQL> <br/> SQL> select to_char (sysdate, 'yyyy/MM/DD hh24: MI: ss') now from dual; </P> <p> now <br/> ----------------- <br/> 2011/05/20 06:22:00 <br/> SQL> select to_char (add_months (sysdate,-1 ), 'yyyy/MM/DD hh24: MI: ss') "1 month before" from dual; </P> <p> 1 month before <br/> ----------------- <br/> 2011/04/20 06:22:02 <br/> SQL> select to_char (sysdate + interval '-1 'month, 'yyyy/MM/DD hh24: MI: ss') "1 month before" from dual; </P> <p> 1 month before <br/> ----------------- <br/> 2011/04/20 06:22:04 <br/> SQL> select to_char (sysdate + interval '1-1 'year month, 'yyyy/MM/DD hh24: MI: ss') "1 year and 1 month later" from dual; </P> <p> 1 year and 1 month later <br/> ---------------------- <br/> 06:22:06 <br/> SQL> select to_char (sysdate + interval '-1-1' year to month, 'yyyy/MM/DD hh24: MI: ss') "1 year and 1 month before" from dual; </P> <p> 1 year and 1 month before <br/> ----------------------- <br/> 2010/04/20 06:22:08 </P> <p> SQL>