ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Função que retorna o tipo de dia (Oracle)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
lucasc
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 10 de Mai de 2007
Mensagens: 305

MensagemEnviada: Ter Fev 01, 2022 9:04 am    Assunto: Função que retorna o tipo de dia (Oracle) Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 02, 2022 11:01 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
lucasc
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 10 de Mai de 2007
Mensagens: 305

MensagemEnviada: Sáb Mar 05, 2022 9:51 pm    Assunto: [Resolvido Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB