Fórum Verificar se data é feriado #623832

18/11/2025

0

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

Responder

Posts

20/11/2025

Arthur Heinrich

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.

Responder

Gostei + 0

24/11/2025

Renan

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

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

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/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]))



Responder

Gostei + 0

01/12/2025

Renan

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 [])


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar