|
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.
|
|