Eu estou com preguiça de fazer resposta decente agora, mas vou te dar uma luz.

Leia a RFC5545, especialmente a parte de rrules.

Pesquise no GitHub implementações na linguagem que estiver usando que deve ter algo. Tem extensões para o Postgres também ou você pode implementar o padrão como descrito na RFC usando tsrange com poucas linhas.

https://icalendar.org/rrule-tool.html

Obrigado, clacerda pela recomendação vou dar uma olhada!