Verificar se data é feriado

Delphi

18/11/2025

Fiz uma pesquisa aqui no forum, mas não achei o que eu preciso.

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

Renan

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

18/11/2025

Você precisa cadastrar os feriados previamente.

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
Renan

Renan

18/11/2025

Estava pensando em usar um DecodeDate para não ficar "refém" de ter que cadastrar os feriados, especialmente os nacionais, por 10 anos ou mais.

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
Emerson Nascimento

Emerson Nascimento

18/11/2025


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
Emerson Nascimento

Emerson Nascimento

18/11/2025

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/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
Renan

Renan

18/11/2025

Olá Emerson.

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
POSTAR