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;