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

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

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

Элементы конструкций для вычисления интервального времени могут быть заданы <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|