ORACLE - Retorno de valores dentro de um período

Pessoal, bom dia!
Estou precisando montar um relatório que funciona da seguinte maneira:
Preciso retornar os valores dentro do período de 2 datas de tabelas distintas, essas que sejam no período máximo de 12 horas entre elas. Até aí beleza, já consegui esse resultado que está mais ou menos assim:

Nome | Tipo Atendimento | Data Entrada (tabela x) | Data Encaminhamento (tabela y)

O problema é que a Data de Entrada e a Data de Encaminhamento podem ter muitos dias e até meses entre elas, e eu preciso que o resultado me retorne somente os que não ultrapassem 30 dias de diferença entre elas.

Vocês conseguem me ajudar nessa lógica?

Você pode subtrair as datas (e horas também, dê uma pesquisada) e verificar se o resultado é maior que um número X (de dias). Ex:

CREATE TABLE DATAS1( ID INTEGER,  DATA1 DATE);

CREATE TABLE DATAS2(  ID INTEGER,  DATA2 DATE);

INSERT INTO DATAS1 VALUES (1, to_date('21/11/2018','DD/MM/YYYY'));
INSERT INTO DATAS1 VALUES (2, to_date('21/11/2018','DD/MM/YYYY'));

INSERT INTO DATAS2 VALUES (1, to_date('20/12/2018','DD/MM/YYYY'));
INSERT INTO DATAS2 VALUES (2, to_date('30/12/2018','DD/MM/YYYY'));

SELECT DATAS1.*, DATAS2.* FROM DATAS1, DATAS2
WHERE DATAS1.ID= DATAS2.ID
AND DATAS2.DATA2 - DATAS1.DATA1 < 30

Vai retornar somente 1 registro, o primeiro de cada tabela.

Veja no SQLFiddle: http://sqlfiddle.com/#!4/fc289/2

Abraço.

1 curtida

Vamos ser se eu entendi então: Eu teria que criar duas tabelas pra guardar os registros, uma pra Data Entrada e outra pra Data Encaminhamento, e depois disso fazer um select nessa nova tabela onde a condição vai ser a igualdade das IDs e Data Entrada - Data Encaminhamento menores que 30. Seria isso?

ps: o link “http://sqlfiddle.com/#!4/fc289/2” retornou que a página não está funcionando Oo.

Na sua questão original, eu tinha entendido que você tinha 2 tabelas, e respondi baseado nisso. Mas você não é obrigado a criar 2 tabelas se não precisa, pode fazer tudo em uma só. A subtração independe das tabelas envolvidas, basta que os campos sejam tipo date (ou similares).

O SQLFiddle às vezes dá uns erros mesmo. Tente de novo após alguns minutos. Mas o código que está lá é o mesmo que colei aqui, então você pode criar essas tabelas de teste no seu banco e testar o SQL. Foi só pra exemplificar.

Abraço.

1 curtida

Entendi!
No meu select, uma das condições é que essas duas datas tenham mais de 12 horas depois de serem subtraídas, e está assim:
AND To_Date (To_Char(urgencia.dt_atendimento,'dd/mm/yyyy')||To_Char(urgencia.hr_atendimento,'hh24:mi'),'dd/mm/yyyy hh24:mi') - To_Date (To_Char(atendime.dt_atendimento,'dd/mm/yyyy')||To_Char(atendime.hr_atendimento,'hh24:mi'),'dd/mm/yyyy hh24:mi') > 0.5

Até aí ok, mas além disso elas precisam ser menores que 30 dias. Ou seja, maiores que doze horas e menores que trinta dias.
Eu pensei sei lá, colocar uma variável pra receber essa condição das 12 horas e depois condiciona-la a ser menor que 30 dias, mas não ta rolando.

Que campos de quais tabelas você precisa verificar o intervalo de 30 dias? Ou é referente ao dia atual?

Supondo que dt_atendimento seja um campo date, você só precisa adicionar a nova condição num novo and. Pra ficar mais claro, você pode separar agrupar tudo com parênteses. Algo mais ou menos assim:

AND 
( -- sua verificacao atual
To_Date (To_Char(urgencia.dt_atendimento,'dd/mm/yyyy')||To_Char(urgencia.hr_atendimento,'hh24:mi'),'dd/mm/yyyy hh24:mi') - To_Date (To_Char(atendime.dt_atendimento,'dd/mm/yyyy')||To_Char(atendime.hr_atendimento,'hh24:mi'),'dd/mm/yyyy hh24:mi') > 0.5
)
AND
( -- verifica os 30 dias, basicamente o que eu já tinha sugerido antes
(atendime.dt_atendimento - urgencia.dt_atendimento) < 30
)

Abraço.

1 curtida

Deu certíssimo! A lógica é mais simples so que eu tava tentando fazer haha. Muito obrigado :smiley: