Para quem gosta de usar o Linux Fortune Segue a Biblia em Portugues Joao Ferreira de Almeida - Edicao Revista e Corrigida em formato Linux Fortune, conforme link abaixo: BIBLIA_JFARC_FORTUNES /* Geralmente e complicado obter o ultimo dia valido considerando os feriados nacionais, muito usado no ramo financeiro. */ /* Esse artigo pretende da uma opcao de como obter o ultimo dia util dentre varias solucoes encontradas na net, com o uso de stores functions do Oracle PL/SQL *//* Mostrando como criar uma funcao SQL Oracle isto e em PL/SQL para obter o ultimo dia util, considerando os feriados nacionais dentre outros assuntos correlacionados. */ /* Primeiro criamos uma tabela feriado para melhor elucidar as store functions, conforme script abaixo: */ -- DROP TABLE FERIADO;CREATE TABLE FERIADO( ID_FERIADO NUMBER(10,0) NOT NULL ENABLE , DATA DATE NOT NULL ENABLE , DESCRICAO VARCHAR2(50 BYTE) NOT NULL ENABLE , ID_TIPO_FERIADO NUMBER(3,0) NOT NULL ENABLE -- 1 NACIONAL, 2 ESTADUAL, 3 MUNICIPAL, 4 OUTROS , OBS NVARCHAR2(15) , CONSTRAINT PK_FERIADO_ID_FERIADO PRIMARY KEY (ID_FERIADO) , CONSTRAINT UQ_FERIADO_DATA UNIQUE (DATA));-- DROP SEQUENCE FERIADO_FCSEQ; CREATE SEQUENCE FERIADO_FCSEQINCREMENT BY 1START WITH 1NOCYCLE;-- DROP TRIGGER TG_FERIADO_ID_FERIADO_BI;CREATE OR REPLACE TRIGGER TG_FERIADO_ID_FERIADO_BI BEFORE INSERT ON FERIADOFOR EACH ROW WHEN (new.ID_FERIADO IS NULL) BEGIN SELECT FERIADO_FCSEQ.NEXTVAL INTO :new.ID_FERIADO FROM dual;END;/ALTER TRIGGER TG_FERIADO_ID_FERIADO_BI ENABLE; /* Se desejar usar o o arquivo CSV dos feriados chamado FERIADOS.CSV com CRLF no final de cada linha, use o SQL Loader do Oracle para da carga do arquivo, evitando assim digitacao de datas, e possivel obte-lo CLICANDO AQUI! */ /* Criando o arquivo de controle chamado FERIADO.CTL salvo no diretorio C:\TEMP */ load data infile 'FERIADO.CSV' into table feriado fields terminated by "|" ( data DATE "YYYY-MM-DD" , descricao , id_tipo_feriado , obs )/* Depois executar o SQL Loader, no Linux e igual ao do Windows considerando nome da pasta, no Windows fica assim: */ /* Lembrando de considerar, isto e, permutar seu usuario e senha, ip_servidor e SID do Oracle do seu servidor*/ sqlldr usuario/senha@ip_servidor/SID control=FERIADO.CTL log=X.LOG bad-Z.BAD READSIZE=10000000 /* Depois criamos uma store function para idenficar dias feriados usando a tabela feriado conforme script abaixo: */ CREATE OR REPLACE FUNCTION usf_feriado (d in date) RETURN integer AS x integer; BEGIN SELECT count(*) INTO x FROM feriado WHERE to_char(data,'YYYY-MM-DD') = to_char(d,'YYYY-MM-DD'); IF (x >= 1) THEN RETURN 1; ELSE RETURN 0; END IF; END usf_feriado; /* Logo em seguida criamos um store function para tratar o ultimo dia util, conforme script abaixo: */ CREATE OR REPLACE FUNCTION usf_ultimo_dia_util ( dt_base in date ) RETURN date AS dt_basex date; bo_fimx boolean; BEGIN dt_basex := dt_base; bo_fimx := false; WHILE NOT (bo_fimx) LOOP bo_fimx := to_char(dt_basex,'d') NOT IN ('1','7'); IF usf_feriado(dt_basex) = 1 THEN bo_fimx := false; END IF; IF NOT (bo_fimx) THEN dt_basex := dt_basex - 1; END IF; END LOOP; RETURN dt_basex; EXCEPTION WHEN others THEN RAISE; END usf_ultimo_dia_util; /* Testando o uso da function em SQL puro */ SELECT usf_feriado(sysdate) AS DT FROM DUAL; -- RETORNA 1 PARA FERIADO E 0 PARA OUTROS DIAS ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; -- ALTERA DATA PARA FORMATO 'YYYY-MM-DD'SELECT usf_ultimo_dia_util