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.