GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

ORACLE - Retorno de valores dentro de um período

sql
oracle
Tags: #<Tag:0x00007fb39dffe828> #<Tag:0x00007fb39dffe670>

#1

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?


#3

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.


#4

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.


#5

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.


#6

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.


#7

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.


#8

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