Интервальное время

Интервальное время позволяет представить промежуток времени между двумя датами.

Интервальное время может быть двух типов: интервал лет и месяцев и интервал дней, часов, минут и секунд.

Элементы конструкций для вычисления интервального времени могут быть заданы < SQL-параметром >, который должен содержать спецификацию типа данных параметра.

Для интервального времени разрешены следующие операции:

  1. вычисление интервала времени между значениями типа «дата-время».

    a)
    create or replace table test("Начальная дата" date, "Промежуточная дата" date, "Конечная дата" date);
    
    insert into test ("Начальная дата", "Промежуточная дата", "Конечная дата")
    values (to_date('01.01.2010 12:00:00', 'DD.MM.YYYY HH:MI:SS'),
            to_date('02.01.2010 08:00:00', 'DD.MM.YYYY HH:MI:SS'),
            to_date('10.01.2010 18:00:00', 'DD.MM.YYYY HH:MI:SS'));
    select to_char("Промежуточная дата" - "Конечная дата", 'dd') || ' дней' from test;
    |08 дней|
    
    select to_char("Начальная дата" - "Промежуточная дата", 'hh') || ' часов' from test;
    |20 часов|
    
    select to_char("Начальная дата" - "Конечная дата", '+dd.mm') from test;
    |-09.01|
    
    select to_char("Конечная дата" - "Начальная дата", 'dd') from test;
    |09|
    
    select to_char("Начальная дата" + "Конечная дата", '+dd') from test;
    |+12|
    
    select to_char("Промежуточная дата" + "Начальная дата", 'dd.mi.ss') from test;
    |03.00.00|
    
    b)
    select to_char(:current_date (date) + :start_date (date), 'dd.mm.yyyy');
    01.01.2015
    01.03.2014
    |01.03.4028|
  2. сложение/вычитание интервалов времени с числовыми значениями и интервалами времени.

    a)
    select to_char(("Промежуточная дата" - "Начальная дата") + ("Конечная дата" - "Промежуточная дата"), 'dd') from test;
    |09|
    
    b)
    Блокада Ленинграда длилась с 8 сентября 1941 года 872 дня.
    Узнать, когда она закончилась.
    
    select 'Снятие блокады Ленинграда ' || to_char((to_date('08.09.1941', 'dd.mm.yyyy') + 872), 'dd.mm.yyyy');
    |Снятие блокады Ленинграда 28.01.1944|
    
    c)
    select to_char(:current_date (date) + ? (int),'dd.mm.yyyy');
    01.01.2015
    200
    |20.07.2015|
  3. умножение/деление интервалов времени на числовое значение и на интервал времени.

    a)
    Пятилетку – досрочно, за 4 года и 2 месяца
    (начало пятилетки '01.01.1980', завершение по плану '31.12.1984')
    
    select 'Завершим пятилетку досрочно, за 4 года и 2 месяца, к ' || to_char(to_date('01.01.1980', 'dd.mm.yyyy') + (to_date ('31.12.1984', 'dd.mm.yyyy') - to_date ('01.01.1980', 'dd.mm.yyyy')) * 50/60, 'dd.mm.yyyy');
    |Завершим пятилетку досрочно, за 4 года и 2 месяца, к 01.03.1984|
    
    Вариант:
    select 'Завершим пятилетку досрочно, за 4 года и 2 месяца,  к ' || to_char(to_date('01.01.1980', 'dd.mm.yyyy') + to_date ('02.04','mm.yy'), 'dd.mm.yyyy');
    |Завершим пятилетку досрочно, за 4 года и 2 месяца,  к 01.03.1984|
    
    b)
    Отец ребенка родился 25.03.1976, мать 19.09.1980, ребенок 07.12.2006. Во сколько раз больше разница в годах между рождением ребенка и отца (матери)?
    select round(cast (to_date('25.03.1976', 'dd.mm.yyyy')- to_date('07.12.2006', 'dd.mm.yyyy')) / (to_date('19.09.1980', 'dd.mm.yyyy')- to_date('07.12.2006', 'dd.mm.yyyy')) as decimal,2);
    |                    1.17|
  4. указание знака "-" перед значением интервала времени.

    select -to_date('01:00', 'HH:MI') + to_date('02:00', 'HH:MI');
    |00.00.0000:01:00:00|