ODANIGEEK

Fórmulas Notion 2.0 – Cálculos Avançados com Datas

Aprenda a dominar as fórmulas de datas no Notion! Neste guia completo, você descobrirá como calcular intervalos entre datas, dias úteis e muito mais usando as poderosas fórmulas do Notion.

Se você já se perguntou como automatizar cálculos de prazos, cronogramas ou períodos de projetos no Notion, este artigo é para você. Vamos explorar desde conceitos básicos até fórmulas avançadas, todas testadas e prontas para uso.

Neste artigo você vai aprender:

Seja você um gerente de projetos, profissional de RH ou entusiasta do Notion, estas fórmulas vão ajudar você a automatizar suas tarefas diárias e tornar seu workspace mais eficiente.

No Notion você pode representar datas de começo e fim, de duas formas diferentes:

Dias Corridos entre duas Datas

Dias entre duas Datas: Você pode modelar datas de início de duas formas. Tendo um campo Data de Início e outro Data de Fim, ou um único campo do tipo Data que tem início e fim. Na tabela abaixo, mostro como calcular dias entre as datas. Dependendo de como você modelar suas bases de dados, a forma de aplicar os cálculos de data variam levemente.

Na tabela abaixo, mostro como calcular dias entre as datas. Importante notar que essa fórmula não leva em conta dias úteis. Apenas para calcula os dias entre as datas.

Para ver como fazer o cálculo de dias úteis entre duas datas veja abaixo.

Fórmula para cálculo de diferença entre datas com dois campos

dateBetween(prop("Data Fim"),prop("Data Inicio"),"days")

Fórmula para cálculo de diferença entre datas com um campo

dateBetween(dateEnd(prop("Data Completa")),dateStart(prop("Data Completa")),"days")

Dias Úteis entre duas Datas

Dias Úteis entre duas Datas: A tabela de exemplo abaixo mostra a fórmula para calcular os dias úteis entre duas datas. Nesse exemplo a fórmula desconta os sábados e domingos entre duas datas específicas. Para cada linha temos os seguintes campos:

Para o teste unitário de cada linha, temos 2 colunas.

Para a fórmula de cálculo de dias úteis, temos uma coluna.

Essa fórmula tem o mesmo funcionamento da =NETWORKDAYS() que é conhecida por usuários de Excel e de Google Planilhas.

Fórmula comentada para cálculo de dias úteis entre duas datas. Ela poderia ser ainda mais otimizada, mas eu optei por deixar dessa forma para também manter a uma melhor capacidade de leitura e entendimento. Do ponto de vista de Complexidade Ciclomática, essa fórmula tem baixa Ordem O(C), uma vez que não tem loops e usa apenas cálculos matemáticos, resultando em ótima performance. Essa fórmula é uma adaptação para o Notion dessa equação encontrada no Stackoverflow.

lets(
	/* número de dias corridos entre a data de início e a de fim */
	numDays, dateBetween(dateEnd(prop("Data")),dateStart(prop("Data")),"days"),
	
	/* número de semanas inteiras entre as duas datas */
	numWeeks, floor(numDays / 7),
	
	/* calcula o resto da divisão por 7 para representar os dias que sobram das semanas completas*/	
	numDaysLeft, numDays % 7,
	
	/* calcula os dias de descanso */
	numHolidays,
		ifs(
			/* se segunda-feira */
			day(dateStart(prop("Data"))) == 1, 
				numWeeks * 2 + if(numDaysLeft > 4,min(numDaysLeft - 4,2),0),
			/* se terça-feira */
			day(dateStart(prop("Data"))) == 2, 
				numWeeks * 2 + if(numDaysLeft > 3,min(numDaysLeft - 3,2),0),
			/* se quarta-feira */
			day(dateStart(prop("Data"))) == 3, 
				numWeeks * 2 + if(numDaysLeft > 2,min(numDaysLeft - 2,2),0),
			/* se quinta-feira */
			day(dateStart(prop("Data"))) == 4, 
				numWeeks * 2 + if(numDaysLeft > 1,min(numDaysLeft - 1,2),0),
			/* se sexta-feira */
			day(dateStart(prop("Data"))) == 5, 
				numWeeks * 2 + if(numDaysLeft > 0,min(numDaysLeft,2),0),
			/* se sábado */
			day(dateStart(prop("Data"))) == 6, 
				1 + numWeeks * 2 + if(numDaysLeft > 0,1,0),
			/* se domingo */
			day(dateStart(prop("Data"))) == 7, 
				1 + numWeeks * 2 + if(numDaysLeft > 5,1,0),
			/* else - nunca deve chegar aqui, mas precisa da instrução na estrutura do ifs() */
			0
		),
	
	numDays - numHolidays + 1
)


Uma versão reduzida, porém menos legível dessa mesma fórmula é a seguinte:

lets(
	/* número de dias corridos entre a data de início e a de fim */
	numDays, dateBetween(dateEnd(prop("Data")),dateStart(prop("Data")),"days"),
	
	/* número de semanas inteiras entre as duas datas */
	numWeeks, floor(numDays / 7),
	
	/* calcula o resto da divisão por 7 para representar os dias que sobram das semanas completas*/	
	numDaysLeft, numDays % 7,
	
	/* dia da semana em que inicia o inteårvalo Segunda = 1, Domingo = 7 */
	dow, day(dateStart(prop("Data"))),
	
	/* calcula os dias de descanso */
	numHolidays,
		ifs(
			/* se segunda-feira a sexta-feira */
			[1,2,3,4,5].contains(dow), 
				numWeeks * 2 + if(numDaysLeft > (5 - dow),min(numDaysLeft - (5 - dow),2),0),
			/* se sábado */
			day(dateStart(prop("Data"))) == 6, 
				1 + numWeeks * 2 + if(numDaysLeft > 0,1,0),
			/* se domingo */
			day(dateStart(prop("Data"))) == 7, 
				1 + numWeeks * 2 + if(numDaysLeft > 5,1,0),
			/* else - nunca deve chegar aqui, mas precisa da instrução na estrutura do ifs() */
			0
		),
	
	numDays - numHolidays + 1
)

Dias Úteis à partir de uma Data

Dias Úteis à partir de uma Data: À partir de dois parâmetros, sendo uma data inicial e uma quantidade de dias úteis, a fórmula calcula uma data final que representa a quantidade de dias úteis decorridos desde a data apontada. Ex. Se eu somar 10 dias úteis ao dia 16/09/2024, que dia eu tenho?

Para o teste unitário de cada linha, temos 2 colunas.

Para a fórmula de cálculo de dias úteis, temos uma coluna.

Fórmula comentada para calcular uma data futura à partir de uma data inicial e somando dias úteis

lets(
	/* quantas semanas inteiras existem de Dias úteis, ou seja, 5 dias. (seg a sex) */
	semanas_inteiras, max(0,floor((prop("Dias Uteis a Somar") - 1) / 5)),
	/* quantos dias uteis "sobram" sem formar uma semana inteira; o -1 significa que o dia atual é considerado sempre = de segunda a sexta, são 5 dias uteis.*/
	dias_uteis_sobrando,prop("Dias Uteis a Somar") - floor((prop("Dias Uteis a Somar") - 1) / 5) * 5 -1,
	/* "move" a data inicial somando a quantidade de semanas inteiras */
	date_semanas_inteiras,dateAdd(prop("Data"),semanas_inteiras,"weeks"),
	
	/* se a data para a qual movemos a data inicial é sabado ou domingo, joga para segunda */
	dia,day(date_semanas_inteiras),
	offset_inicio_fds,if(contains([6,7],dia),8-dia,0),
	date_offset_inicio_fds,dateAdd(date_semanas_inteiras,offset_inicio_fds,"days"),
	
	/* guarda o dia da semana para a data que foi movida */
	dia_offset_inicio_fds,day(date_offset_inicio_fds),
	
	/* soma os dias sobrando à essa nova data ajustada apos somar as semanas */
	date_offset_sobrando,dateAdd(date_offset_inicio_fds,dias_uteis_sobrando,"days"),
	dia_offset_sobrando,day(date_offset_sobrando),
	
	/* ajusta a suposta data final caso caia ou tenha passado por um final de semana */
	offset_final,
			ifs(
				/* se essa data cair no final de semana, joga para segunda */
				contains([6,7],dia_offset_sobrando),
				8-dia_offset_sobrando,
				/* se entre uma data e outra, passou pelo fds, ajusta +2 */
				dia_offset_sobrando < dia_offset_inicio_fds,
				2,
				0
			),
	final_date,dateAdd(date_offset_sobrando,offset_final,"days"),
	
	/* retorna a data final */
	final_date
)