Fórum Verificar se data é feriado #623832
18/11/2025
0
Vamos imaginar que eu queira saber quais são os feriados num periodo de 10 anos.
Primeiro, crio uma tabela e cadastro os feriados desejados, como por exemplo:
01/01/2025 ANO NOVO 25/12/2025 NATAL
Uso 2 DateTimePicker para definir a data de inicio e data de fim e faço uma consulta SQL para localizar as datas.
O problema é que quando minha busca sair do ano 2025 e for para o ano 2026, não vou achar nenhum feriado.
Então queria ver com vocês qual seria a melhor alternativa para eu realizar essa busca
Renan
Curtir tópico
+ 0Posts
20/11/2025
Arthur Heinrich
Existem 3 tipos de feriados:
1 - Feriados Nacionais Fixos
Feriados como o dia da Independência do Brasil ou Programação da República, são exemplos. Como eles ocorrem sempre no mesmo dia do ano e se aplicam a todo o território nacional, podem ser cadastrados com antecedência de X anos, de forma automatizada. Por exemplo, 10 anos à frente, dependendo de sua necessidade.
2 - Feriados Nacionais Móveis
Estes ocorrem, geralmente, associados à Páscoa. Sendo assim, a primeira tarefa é definir quando a Páscoa ocorrerá no ano (e anos seguintes), para depois calcular os demais.
A Páscoa é celebrada no primeiro domingo após a primeira lua cheia que ocorre em ou após o equinócio de março (dia 21 de março, data eclesiástica fixa que representa o início da primavera no Hemisfério Norte/outono no Hemisfério Sul). A data da Páscoa pode, assim, variar entre 22 de março e 25 de abril.
A partir deste domingo de Páscoa, calcula-se os demais feriados somando ou subtraindo uma quantidade fíxa de dias.
3 - Feriados Estaduais ou Municipais
Feriados estaduais e municipais são, em geral, fixos. Ou seja, sempre ocorrem na mesma data. Porém, sua abrangência não é nacional. Exemplos disso, em São Paulo, são o dia 25/janeiro, em que se comemora o aniversário da cidade de São Paulo e 09/julho, em que se comemora a Revolução Constitucionalista de 1932 no Estado de São Paulo.
Para estes, requer um cadastro mais complexo, mas não impossível de se programar de forma automatizada e o sistema precisa avaliar se é feriado ou não, de acordo com a localização geográfica do usuário.
Gostei + 0
24/11/2025
Renan
Então eu buscaria na tabela de feriados a data completa, mas faria a comparação somente pelo dia e mês...
O problema é que na minha rotina atual tem o calculo de parcelas e não posso usar o DecodeDate ali, senão quando eu lançar parcelas em 60x, por exemplo, o sistema se perderia.
Acho que realmente vou precisar cadastrar os feriados da forma que você mencionou.
Gostei + 0
29/11/2025
Emerson Nascimento
Usando o exemplo do Arthur Heinrich, quando for um feriado fixo, você não precisa cadastrar diversas vezes por causa do ano. Basta ignorar o ano ao fazer a busca.
O cadastro seria mais ou menos assim:
Dia : [mês/ano]
Ano: [um conteúdo ou vazio]
Abrangencia: [Nacional / Estadual / Municipal]
Local: [se estadual, o estado; se municipal o município+estado]
Descrição: [descrição do feriado]
Com índice por todos os campos
Exemplo de cadastro:
Dia : 01/01
Ano: (vazio)
Abrangencia: Nacional
Local: (ignorado, porque agrangência é nacional)
Descrição: Confraternização universal
Dia : 12/25
Ano: (vazio)
Abrangencia: Nacional
Local: (ignorado, porque agrangência é nacional)
Descrição: Natal
Ao fazer a busca, você faria algo como:
dia = '01/01'
and (ano = ' ' or ano = [ano desejado])
and ((abrangencia = 'Nacional') or (abrangencia = 'Estadual' and local = [UF desejada]) or (abrangencia = 'Municipal' and local = [Cidade/UF desejada]))
Isto serve para gerar datas de vencimentos de títulos baseados no destino.
Comumente as empresas alteram a data de vencimento de um título em razão da própia localidade, mas eu estiver em São Paulo/SP e fizer uma venda para Belo Horizonte/MG eu preciso me preocupar com o feriado de Belo Horizonte, não de São Paulo.
Gostei + 0
29/11/2025
Emerson Nascimento
O cadastro seria mais ou menos assim:
Dia : [mês/DIA]
Ano: [um conteúdo ou vazio]
Abrangencia: [Nacional / Estadual / Municipal]
Local: [se estadual, o estado; se municipal o município+estado]
Descrição: [descrição do feriado]
Com índice por todos os campos
Exemplo de cadastro:
Dia : 01/01
Ano: (vazio)
Abrangencia: Nacional
Local: (ignorado, porque agrangência é nacional)
Descrição: Confraternização universal
Dia : 01/25
Ano: (vazio)
Abrangencia: Municipal
Local: São Paulo/SP
Descrição: Confraternização universal
Dia : 03/04
Ano: 2025
Abrangencia: Estadual
Local: SP
Descrição: Carnaval
Dia : 07/09
Ano: (vazio)
Abrangencia: Estadual
Local: SP
Descrição: Revolução constitucionalista
Dia : 12/25
Ano: (vazio)
Abrangencia: Nacional
Local: (ignorado, porque agrangência é nacional)
Descrição: Natal
Ao fazer a busca, você faria algo como:
dia = '01/01'
and (ano = ' ' or ano = [ano desejado])
and ((abrangencia = 'Nacional') or (abrangencia = 'Estadual' and local = [UF desejada]) or (abrangencia = 'Municipal' and local = [Cidade/UF desejada]))
Isto serve para gerar datas de vencimentos de títulos baseados também no destino.
Comumente as empresas alteram a data de vencimento de um título em razão da própia localidade, mas eu estiver em São Paulo/SP e fizer uma venda para Belo Horizonte/MG eu preciso me preocupar com o feriado de Belo Horizonte, não de São Paulo.
Para buscar todos os feriados dos próximos 10 anos basta fazer:
and (ano = ' ' or ano <= 2035)
Para buscar os feriados dos próximos 10 anos da tua localidade:
and (ano = ' ' or ano <= 2035)
and ((abrangencia = 'Nacional') or (abrangencia = 'Estadual' and local = [UF desejada]) or (abrangencia = 'Municipal' and local = [Cidade/UF desejada]))
Gostei + 0
01/12/2025
Renan
Entendi sua lógica, mas não estou conseguindo adaptar ao meu cenário.
Vou tentar te explicar como é hoje:
Na geração de parcelas tenho uma variavel chamada DataGravar que recebe a data de vencimento da parcela. Essa variavel está dentro de um For e é alimentada conforme o susrio informar(a cada x dias ou mensalmente).
Para verificar os finais de semana o DataGravar passa por uma function
result := not in dayofweek [1,7] or clientdataset.locate('dataferiado', Dia [])Gostei + 0
09/12/2025
Emerson Nascimento
Dia (string) : [mês/DIA]
Ano (numero) : [um conteúdo ou 0 ou null]
Abrangencia (string): [Nacional / Estadual / Municipal]
Local (string): [se estadual, o estado; se municipal o município+estado]
Descrição (string): [descrição do feriado]
crie uma função para retornar se uma data é feriado. algo assim:
// Verifica se uma data é feriado ou final de semana
function IsHoliday(dtData: TDate; strMunicipio: string; strUF: string): Boolean;
var
Dia: Word;
Mes: Word;
Ano: Word;
Feriado: TFeriado;
MesDia: string;
begin
Result := (DayOfWeek(dtData) in [1,7]);
if not Result then // se não é fim de semana, então avalia se é feriado
begin
DecodeDate(dtData, Ano, Mes, Dia);
MesDia := FormatFloat('00', Mes) + '/' + FormatFloat('00', Dia)
strQuery := 'SELECT DIA FROM FERIADOS WHERE' +
' DIA = ' + QuotedStr(MesDia) +
' AND (COALESCE(ANO,0) = 0 OR ANO = ' + IntToStr(Ano) + ')' +
' AND ((ABRANGENCIA = ''Nacional'') OR'+
' (ABRANGENCIA = ''Estadual'' AND LOCAL = '+QuotedStr(strUF)+') OR'+
' (ABRANGENCIA = ''Municipal'' and local = ' + QuotedStr(strMunicipio + '/' + strUF) + '))'
// a execução da consulta vai depender do banco de dados e do componente de conexão
[executa a consulta]
// a forma de tratar o retorno vai depender do componente utilizado
Result := not dataset.Eof;
// fecha dataset/libera memória
end;
enddaí você usa assim:
vencimento := [data calculada]; strMunicipio := 'São Paulo' strUF := 'SP' while IsHoliday(vencimento, strMuincipio, strUF) do IncDay(vencimento);
Gostei + 0
22/12/2025
Cns Limitada
https://PrivateLadyEscorts.com
[url=https://PrivateLadyEscorts.com/girls.html] Private Lady From Your Town [/url] - Anonymous Adult Dating - No Verify
Gostei + 0
05/01/2026
Calculo Salario
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)