Verificar se data é feriado
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:
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
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
Curtidas 0
Respostas
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.
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
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.
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
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
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]))
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
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
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