| 
			
				|  | ActiveDelphi .: O site do programador Delphi! :.
 
 |  
 
	
		| Exibir mensagem anterior :: Exibir próxima mensagem |  
		| Autor | Mensagem |  
		| lucasc Membro Junior
 
  
 
 Registrado: Quinta-Feira, 10 de Mai de 2007
 Mensagens: 305
 
 
 | 
			
				|  Enviada: Ter Fev 01, 2022 9:04 am    Assunto: Função que retorna o tipo de dia (Oracle) |   |  
				| 
 |  
				| Prezados, 
 Tenho a seguinte situação: (banco Oracle)
 
 Uma tabela onde gravo todos os feriados do ano
 
 CREATE OPE_FERIADOS(DATA DATE)
 
 INSERT INTO OPE_FERIADOS VALUES('31/01/2022')
 
 Preciso criar uma função que retorne o dia da semana de uma determinada data, porém se aquela data estiver na tabela OPE_FERIADOS, preciso que retorne o tipo de dia 1 - Domingo.
 
 Esse script faz exatamente o que preciso, porém preciso consultar primeiro se a data não consta na tabela OPE_FERIADOS:
 
 SELECT Decode(to_char(SYSDATE,'d'),1,'Domingo',
 2,'Segunda-Feira',
 3,'Terça-Feira',
 4,'Quarta-Feira',
 5,'Quinta-Feira',
 6,'Sexta-Feira',
 7,'Sábado') FROM dual
 
 
 Criei a seguinte função, mas só retorna dado, quando localiza a data na tabela OPE_FERIADOS, se não localizar, retorna null
 
  	  | Código: |  	  | CREATE OR REPLACE FUNCTION FGET_TIPODIA(PDATA DATE) RETURN INT IS TIPODIA INT;
 VDATA DATE;
 VRETORNO INT;
 BEGIN
 SELECT DATA INTO VDATA FROM OPE_FERIADOS WHERE DATA = PDATA;
 IF VDATA IS NOT NULL THEN
 RETURN 1;
 ELSE
 SELECT TO_CHAR(PDATA,'d') INTO VRETORNO FROM DUAL;
 END IF;
 RETURN  VRETORNO;
 END;
 
 SELECT FGET_TIPODIA(SYSDATE)  FROM DUAL
 
 
 | 
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Fev 02, 2022 11:01 am    Assunto: |   |  
				| 
 |  
				| Bom dia, 
 Não tenho nenhuma experiência com o Oracle, mas talvez você possa utilizar a função Coalesce e eliminar esse If:
 
 
  	  | Código: |  	  | SELECT COALESCE
 ((SELECT '1' FROM OPE_FERIADOS WHERE DATA = PDATA),
 (SELECT TO_CHAR(PDATA,'d') FROM DUAL))
 INTO VRETORNO
 FROM DUAL;
 RETURN  VRETORNO;
 | 
 
 Espero que ajude
 
 Editado pela última vez por imex em Ter Mar 07, 2023 6:02 pm, num total de 1 vez
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| lucasc Membro Junior
 
  
 
 Registrado: Quinta-Feira, 10 de Mai de 2007
 Mensagens: 305
 
 
 | 
			
				|  Enviada: Sáb Mar 05, 2022 9:51 pm    Assunto: [Resolvido |   |  
				| 
 |  
				| Obrigado amigo, resolvi da seguinte forma: 
 
  	  | Código: |  	  | CREATE OR REPLACE FUNCTION FGET_TIPODIA(PDATA DATE) RETURN INT IS TIPODIA NUMBER;
 VRETORNO NUMBER;
 BEGIN
 SELECT
 CASE
 WHEN (SELECT TIPO FROM OPE_FERIADOS WHERE DATA = PDATA) IS NULL THEN
 CASE
 WHEN CAST((SELECT TO_CHAR(TO_DATE(PDATA),'d') FROM DUAL) AS INT) = 1 THEN 3
 WHEN CAST((SELECT TO_CHAR(TO_DATE(PDATA),'d') FROM DUAL) AS INT) = 7 THEN 2
 WHEN CAST((SELECT TO_CHAR(TO_DATE(PDATA),'d') FROM DUAL) AS INT) BETWEEN 2 AND 6 THEN 1
 END
 ELSE
 (SELECT TIPO FROM OPE_FERIADOS WHERE DATA = PDATA)
 END INTO VRETORNO
 FROM DUAL;
 RETURN VRETORNO;
 END;
 
 
 | 
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		|  |  
  
	| 
 
 | Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido
 Editar Mensagens: Proibido.
 Excluir Mensagens: Proibido.
 Votar em Enquetes: Proibido.
 
 |  |