В Oracle как и в других системах управления базами данных с датами можно производить арифметические действия. Стоит только помнить, что сложение и вычитание с числовыми значениями происходит по-умолчанию в контексте дней. То есть выражение вида
select sysdate + 1 from dual
на выходе даст текущую дату увеличенную ровно на 1 день, поэтому, результат разницы между датами будет исчисляться днями, это и понятно - date1 + N = date2, откуда date2 - date1 = N. Складывать даты между собой запрещено, так как это не имеет смысла. Если нужны другие контексты (месяцы, года, секунды и прочее), тогда прибегают к иному способу
select sysdate ± interval '1' year from dual
select sysdate ± interval '1' month from dual
select sysdate ± interval '1' day from dual
select sysdate ± interval '1' hour from dual
select sysdate ± interval '1' minute from dual
select sysdate ± interval '1' second from dual
select sysdate ± numtodsinterval(1, 'day')
select sysdate ± numtodsinterval(1, 'hour')
select sysdate ± numtodsinterval(1, 'minute') select sysdate ± numtodsinterval(1, 'second')
select sysdate ± numtoyminterval(1, 'month')
select sysdate ± numtoyminterval(1, 'year')
Но разность дат по-умолчанию возвращается в днях, это стоит помнить. Приведу небольшой пример
with
-- first reper date
first_date( fd ) as (
select to_date('01.01.2014 00:00:00', 'dd.mm.yyyy hh24:mi:ss') as fd
from dual
),
-- last reper date
last_date( ld ) as (
select to_date('02.01.2014 00:00:00', 'dd.mm.yyyy hh24:mi:ss') as ld
from dual
),
-- get the difference of the last and the first reper dates
get_diff_dates( diff ) as (
select abs((select ld from last_date) - (select fd from first_date))
from dual
)
select
diff days,
diff * 24 hours,
diff * 24 * 60 minutes,
diff * 24 * 60 * 60 seconds
from get_diff_dates
Вообще для манипуляции с датами в Oracle есть и другие возможности, с которыми лучше всего ознакомиться самостоятельно в документации. Всем успехов.