como retringir periodo após as 18hs

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
wwashington
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 06 Jan 2009 11:31 am
Localização: São paulo

pessoal, sou iniciante e preciso de uma função ou soulução que restringe período após as 18hs até as 8hs de seg. a sexta e sábado após as 12hs e o domingo, preciso retornar o tempo que os técnico demoram para atender um chamado restringindo o periodo para não mascarar o tempo real.

Selecionar tudo

uivo text_io.file_type; 

cursor C(pDtIni date, pDtFim date) is
-- principal
select sol.cd_os,
       to_char(sol.dt_pedido,'dd/mm/yyyy hh24:mi') dt_pedido,
       to_char(sol.dt_execucao,'dd/mm/yyyy hh24:mi') dt_execucao,       
       fn_idade(sol.dt_pedido, 'a A m M d D h H mi MI', sol.dt_execucao) tempo_gasto,
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Faz uns testes com estes exemplos abaixo...

Selecionar tudo


SELECT TO_CHAR(SYSDATE,'hh24') hora
FROM dual;


IF TO_CHAR(teu_campo,'hh24') <= '08' OR
   TO_CHAR(teu_campo,'hh24') >= '24' 
THEN 
  dbms_output.put_line('Erro, não pode efetuar transação neste horário. ');
ELSE 
  dbms_output.put_line('OK! ');  
END IF; 


Qualquer coisa, manda pra gente...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eae Trevis

Mas acho que não é isso que ele quer.
Acho que é algo assim:
* O cara começou o trabalho as 5:00pm e terminou as 09:00am do outro dia.

Teoricamente, ele só trabalhou 2 horas. Mas se fizer FIM-INICIO, vai mostrar 16 horas! saca ?
renan_pre
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Ter, 10 Abr 2007 11:08 am
Localização: São Paulo - SP
M. Renan

Galera, trabalho com o washington que postou o problema.
Não tenho a solução mas posso tentar resumir o que ele precisa:
É exatamente como o Dr. Gori disse... precisamos calcular o tempo que um chamado levou para ser atendido, porém, esse tempo deve ser calculado dentro do horário de expediente: de segunda a sexta das 8:00 às 18:00, de sábado das 9:00 às 12:00 e não contar domingos.

É isso mesmo Dr.Gori, só estou reforçando! hehe... valeu !
schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China

Li o seu topico rapidamente e pensei algo mas não testei e não sei dizer se realmente ira funcionar, mas a minha ideia seria algo assim:

colocar em alguma tabela o horario de trabalho,
tipo segunda - 08:00 ate 18:00
Terca 08:00 - 18:00
Sabado 09:00 - 12:00

e dai fazer a sua consulta utilizando essas datas e horarios.
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Olá!

Talvez seu problema possa ser resolvido com um "loopzinho"...

Algo assim:

Código:

Selecionar tudo

Declare

v_inicio_servico  date := to_date('01/01/2009 10:00','dd/mm/yyyy hh24:mi');
v_fim_servico     date := to_date('03/01/2009 14:00','dd/mm/yyyy hh24:mi');
v_hora_inicial    varchar2(5) := '08:00';
v_hora_final      varchar2(5) := '17:00';
v_inicio_periodo  date;
v_fim_periodo     date;
v_horas           number := 0;
v_dias            number := 0;
v_data_corrente   date;

Begin

v_inicio_periodo := trunc(v_inicio_servico);
v_data_corrente  := trunc(v_inicio_servico);

WHILE trunc(v_data_corrente,'dd') <= trunc(v_fim_servico,'dd')  LOOP
  
  If v_inicio_servico > to_date(to_char(v_inicio_periodo,'dd/mm/yy')||v_hora_inicial,'dd/mm/yyhh24:mi') then
    v_inicio_periodo := v_inicio_servico;
  Else 
    v_inicio_periodo := to_date(to_char(v_inicio_periodo,'dd/mm/yy')||v_hora_inicial,'dd/mm/yyhh24:mi');
  End if;
  If v_fim_servico < to_date(to_char(v_data_corrente,'dd/mm/yy')||v_hora_final,'dd/mm/yyhh24:mi') then
    v_fim_periodo := v_fim_servico;
  Else 
    v_fim_periodo := to_date(to_char(v_data_corrente,'dd/mm/yy')||v_hora_final,'dd/mm/yyhh24:mi');
  End if;
  v_dias :=  v_dias + (v_fim_periodo - v_inicio_periodo);
  
  v_data_corrente := v_data_corrente + 1;
  
  v_inicio_periodo := v_data_corrente;
  
END LOOP;

v_horas := v_dias * 24;

dbms_output.put_line(v_horas);

End;
/

Não ficou muito elegante, mas é só pra dar uma ideia do q imaginei. :oops: :lol:

Abraço :!:
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Brother...
usando a lógica que o marcio.adao postou aqui,
segue o código com as validações com dias da semana...

Selecionar tudo

DECLARE

	v_inicio_servico   DATE := to_date('09/01/2009 10:00', 'dd/mm/yyyy hh24:mi');
	v_fim_servico      DATE := to_date('12/01/2009 14:00', 'dd/mm/yyyy hh24:mi');
	v_hora_inicial     VARCHAR2(5) := '08:00';
	v_hora_final       VARCHAR2(5) := '18:00';
	v_hora_inicial_sab VARCHAR2(5) := '09:00';
	v_hora_final_sab   VARCHAR2(5) := '12:00';
	v_inicio_periodo   DATE;
	v_fim_periodo      DATE;
	v_horas            NUMBER := 0;
	v_dias             NUMBER := 0;
	v_data_corrente    DATE;

BEGIN

	v_inicio_periodo := trunc(v_inicio_servico);
	v_data_corrente  := trunc(v_inicio_servico);

	WHILE trunc(v_data_corrente, 'dd') <= trunc(v_fim_servico, 'dd')
	LOOP
		IF upper(TRIM(to_char(v_data_corrente, 'day'))) IN
			 ('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY') THEN
			IF v_inicio_servico >
				 to_date(to_char(v_inicio_periodo, 'dd/mm/yy') || v_hora_inicial
								,'dd/mm/yyhh24:mi') THEN
				v_inicio_periodo := v_inicio_servico;
			ELSE
				v_inicio_periodo := to_date(to_char(v_inicio_periodo, 'dd/mm/yy') ||
																		v_hora_inicial
																	 ,'dd/mm/yyhh24:mi');
			END IF;
		
			IF v_fim_servico <
				 to_date(to_char(v_data_corrente, 'dd/mm/yy') || v_hora_final
								,'dd/mm/yyhh24:mi') THEN
				v_fim_periodo := v_fim_servico;
			ELSE
				v_fim_periodo := to_date(to_char(v_data_corrente, 'dd/mm/yy') ||
																 v_hora_final
																,'dd/mm/yyhh24:mi');
			END IF;
		
		ELSIF upper(TRIM(to_char(v_data_corrente, 'day'))) = 'SATURDAY' THEN
			IF v_inicio_servico >
				 to_date(to_char(v_inicio_periodo, 'dd/mm/yy') || v_hora_inicial_sab
								,'dd/mm/yyhh24:mi') THEN
				v_inicio_periodo := v_inicio_servico;
			ELSE
				v_inicio_periodo := to_date(to_char(v_inicio_periodo, 'dd/mm/yy') ||
																		v_hora_inicial_sab
																	 ,'dd/mm/yyhh24:mi');
			END IF;
			IF v_fim_servico <
				 to_date(to_char(v_data_corrente, 'dd/mm/yy') || v_hora_final_sab
								,'dd/mm/yyhh24:mi') THEN
				v_fim_periodo := v_fim_servico;
			ELSE
				v_fim_periodo := to_date(to_char(v_data_corrente, 'dd/mm/yy') ||
																 v_hora_final_sab
																,'dd/mm/yyhh24:mi');
			END IF;
		END IF;
	
		IF upper(TRIM(to_char(v_data_corrente, 'day'))) <> 'SUNDAY' THEN
			v_dias := v_dias + (v_fim_periodo - v_inicio_periodo);
		END IF;
	
		v_data_corrente  := v_data_corrente + 1;
		v_inicio_periodo := v_data_corrente;
	
	END LOOP;

	v_horas := v_dias * 24;
	dbms_output.put_line(v_horas);

END;
Ficou ainda menos elegante que a versão anterior, mas está funcional eiuaheiaheieahiueha

:-o
wwashington
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 06 Jan 2009 11:31 am
Localização: São paulo

Galera valeu!!!Obrigado pela força!!!
alexandre_costa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Seg, 25 Ago 2008 11:18 am
Localização: Nova Mutum-MT
Alexandre Costa


DBA Oracle

Deselegante.... mas funcional!

só para FLORIAR.. rsrs

o final pode ficar assim:

Selecionar tudo

v_horas := v_dias * 24;
   dbms_output.put_line(TRUNC(v_dias)||' Dia(s) e   '||TRUNC(MOD(v_horas, 24))||' Hr(s)');

Abraços
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes