Trabalhando com tipos de dados INTERVAL

Temos na documentação Oracle 4 tidos funções INTERVAL, sendo elas: NUMTODSINTERVAL, NUMTOYMINTERVAL, TO_DSINTERVAL, TO_YMINTERVAL.

NUMTODSINTERVAL

Sintaxe:
NUMTODSINTERVAL(n, ‘interval_unit’)

NUMTODSINTERVAL converte n em um literal INTERVAL DAY TO SECOND. O argumento n pode ser qualquer valor NUMBER ou uma expressão que possa ser implicitamente convertida em um valor NUMBER. O argumento interval_unit pode ser do tipo de dados CHAR, VARCHAR2, NCHAR ou NVARCHAR2. O valor para interval_unit especifica a unidade de n e deve ser resolvida para um dos seguintes valores de sequência: DAY, HOUR, MINUTE, SECOND.

interval_unit não diferencia maiúsculas de minúsculas. Os valores iniciais e finais entre parênteses são ignorados. Por padrão, a precisão do retorno é 9.

O exemplo a seguir usa NUMTODSINTERVAL em uma função analítica COUNT para calcular, para cada funcionário, o número de funcionários contratados pelo mesmo gerente nos últimos 100 dias a partir da data de contratação. Consulte “Funções analíticas” para obter mais informações sobre a sintaxe das funções analíticas.

SELECT manager_id, last_name, hire_date,
       COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date 
       RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count 
  FROM employees
  ORDER BY last_name, hire_date;

MANAGER_ID LAST_NAME                 HIRE_DATE    T_COUNT
---------- ------------------------- --------- ----------
       149 Abel                      11-MAY-04          1
       147 Ande                      24-MAR-08          3
       121 Atkinson                  30-OCT-05          2
       103 Austin                    25-JUN-05          1
. . .
       124 Walsh                     24-APR-06          2
       100 Weiss                     18-JUL-04          1
       101 Whalen                    17-SEP-03          1
       100 Zlotkey                   29-JAN-08          2

NUMTOYMINTERVAL

Sintaxe:
NUMTOYMINTERVAL(n, ‘interval_unit’)

NUMTOYMINTERVAL converte o número n em um literal INTERVAL YEAR TO MONTH. O argumento n pode ser qualquer valor NUMBER ou uma expressão que possa ser implicitamente convertida em um valor NUMBER. O argumento interval_unit pode ser do tipo de dados CHAR, VARCHAR2, NCHAR ou NVARCHAR2. O valor para interval_unit especifica a unidade de n e deve ser resolvida para um dos seguintes valores de sequência: YEAR, MONTH.

interval_unit não diferencia maiúsculas de minúsculas. Os valores iniciais e finais entre parênteses são ignorados. Por padrão, a precisão do retorno é 9.

Exemplos:

O exemplo a seguir usa NUMTOYMINTERVAL em uma função analítica SUM para calcular, para cada funcionário, o salário total de funcionários contratados nos últimos um ano a partir da data de contratação. Consulte “Funções analíticas” para obter mais informações sobre a sintaxe das funções analíticas.

SELECT last_name, hire_date, salary,
       SUM(salary) OVER (ORDER BY hire_date 
       RANGE NUMTOYMINTERVAL(1,'year') PRECEDING) AS t_sal 
  FROM employees
  ORDER BY last_name, hire_date;

LAST_NAME                 HIRE_DATE     SALARY      T_SAL
------------------------- --------- ---------- ----------
Abel                      11-MAY-04      11000      90300
Ande                      24-MAR-08       6400     112500
Atkinson                  30-OCT-05       2800     177000
Austin                    25-JUN-05       4800     134700
. . .
Walsh                     24-APR-06       3100     186200
Weiss                     18-JUL-04       8000      70900
Whalen                    17-SEP-03       4400      54000
Zlotkey                   29-JAN-08      10500     119000

TO_DSINTERVAL

Sintaxe:
TO_DSINTERVAL ( ‘ { sql_format | ds_iso_format } ‘ )

sql_format
[+ | -] days hours : minutes : seconds [. frac_secs ] 
ds_iso_format
[-] P [days D]
  [T [hours H] [minutes M] [seconds [. frac_secs] S ] ]

TO_DSINTERVAL converte uma cadeia de caracteres do tipo de dados CHAR, VARCHAR2, NCHAR ou NVARCHAR2 em um tipo INTERVAL DAY TO SECOND.

No sql_format, days é um número inteiro entre 0 e 999999999, horas é um número inteiro entre 0 e 23 e minutos e segundos são números inteiros entre 0 e 59. frac_secs é a parte fracionária de segundos entre 0,0 e .999999999. Um ou mais espaços em branco separam os dias das horas. Espaços em branco adicionais são permitidos entre elementos de formato.

No formato ISO ds_iso_format, dias, horas, minutos e segundos são números inteiros entre 0 e 999999999. frac_secs é a parte fracionária de segundos entre 0,0 e .999999999. Nenhum espaço em branco é permitido no valor. Se você especificar T, deverá especificar pelo menos um dos valores de horas, minutos ou segundos.

Exemplos:

O exemplo a seguir usa o formato SQL para selecionar na tabela hr.employees os funcionários que trabalharam para a empresa por pelo menos 100 dias em 1 de novembro de 2002:

SELECT employee_id, last_name FROM employees
   WHERE hire_date + TO_DSINTERVAL('100 00:00:00')
   <= DATE '2002-11-01'
   ORDER BY employee_id;

EMPLOYEE_ID LAST_NAME
----------- ---------------
        102 De Haan
        203 Mavris
        204 Baer
        205 Higgins
        206 Giet

O exemplo a seguir usa o formato ISO para exibir o carimbo de data / hora 100 dias e 5 horas após o início do ano de 2009:

SELECT TO_CHAR(TIMESTAMP '2009-01-01 00:00:00' + TO_DSINTERVAL('P100DT05H'),
   'YYYY-MM-DD HH24:MI:SS') "Time Stamp"
     FROM DUAL;

Time Stamp
-------------------
2009-04-11 05:00:00

TO_YMINTERVAL

TO_YMINTERVAL
  ( '  { [+|-] years - months 
       | ym_iso_format 
       } ' )
ym_iso_format
[-] P [ years Y ] [months M] [days D]
  [T [hours H] [minutes M] [seconds [. frac_secs] S ] ]

TO_YMINTERVAL converte uma sequência de caracteres do tipo de dados CHAR, VARCHAR2, NCHAR ou NVARCHAR2 em um tipo INTERVAL YEAR TO MONTH.

No formato SQL, anos é um número inteiro entre 0 e 999999999 e meses é um número inteiro entre 0 e 11. Espaços em branco adicionais são permitidos entre os elementos de formato.

No formato ISO, anos e meses são números inteiros entre 0 e 999999999. Dias, horas, minutos, segundos e frac_secs são números inteiros não negativos e serão ignorados, se especificado. Nenhum espaço em branco é permitido no valor. Se você especificar T, deverá especificar pelo menos um dos valores de horas, minutos ou segundos.

Exemplos:

O exemplo a seguir calcula para cada funcionário da tabela hr.employees de amostra uma data um ano dois meses após a data da contratação:

SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') "14 months"
   FROM employees;

HIRE_DATE 14 months
--------- ---------
17-JUN-03 17-AUG-04
21-SEP-05 21-NOV-06
13-JAN-01 13-MAR-02
20-MAY-08 20-JUL-09
21-MAY-07 21-JUL-08

. . .

O exemplo a seguir faz o mesmo cálculo usando o formato ISO:

SELECT hire_date, hire_date + TO_YMINTERVAL('P1Y2M') FROM employees;

Referência

Database SQL Language Reference