×

Como filtrar por intervalos de datas

Date Filter

Como filtrar por intervalos de datas

Uma pergunta comum que vemos no Fórum da OutSystems e em projetos é como pesquisar por um intervalo de datas. Como respondi a isso já duas vezes em setembro, é hora de transformá-lo em visualizações e escrevê-lo para todos.

Embora seja uma tarefa fácil para um ser humano, é mais difícil de explicar para um computador. Vamos ver como podemos torná-lo fácil de programar.

E como tivemos o ONE recentemente, usarei as datas da conferência como exemplo.

Regra importante: Data não é o mesmo que Data e Hora!

Se estivermos a falar de reservas de hotel, temos uma data de início e uma data de fim. Se estivermos a falar de uma sessão à qual queres ir, ela tem uma data e hora específicas.

Suponhamos que tens uma reserva de hotel de 11 a 14 de setembro. Na página de check-in do hotel, serão exibidas todas as chegadas no dia 11 que ainda não fizeram o check-in, e só precisam de procurar o hóspede pelo nome.

Reservation.CheckInDate = CurrDate()

O mesmo acontece no momento do check-out. No dia 14, eles verão todas as reservas programadas para sair naquele dia que ainda não fizeram o check-out, e só precisam procurar pelo nome ou número do quarto.

Reservation.CheckOutDate = CurrDate()

Agora, imagina que estás a ver a agenda do evento. O filtro no topo é por dia, e vês vários eventos. O filtro será por dia, mesmo que a sessão tenha uma data e hora. A maneira mais fácil de fazer isso é:

DateTimeToDate(Session.StartTime) = SelectedDay

Dessa forma, apenas a parte da data é considerada, em vez de uma configuração muito mais complexa em que analisariamos a parte da hora para cada DateTime.

Session.StartTime >= NewDateTime(Year(SelectedDay),Month(SelectedDay),Day(SelectedDay), 0, 0, 0) e Session.EndTime >= NewDateTime(Year(SelectedDay),Month(SelectedDay),Day(SelectedDay),23,59,59)

Até agora tudo faz sentido?

O exemplo acima é para filtrar com base em uma única data. Agora, vamos ver como filtrar por intervalo.

Filtrando por data de início e fim

A parte complicada é pensar em todas as combinações possíveis.

A data de início do evento pode ser antes/de/ou depois da data de início do filtro.

A data de término do evento pode ser antes/de/ou depois da data de término do filtro.

E, é claro, a data de término do evento não pode ser anterior à data de início do evento.

Isso cria 15 combinações possíveis que podemos representar visualmente.

Criar um filtro com 15 regras é complicado, então vamos simplificar isso para apenas dois filtros usando um truque simples.

Se a regra for “parte do evento está dentro do intervalo”, o truque é perceber que na maioria dos casos o evento se encaixa no intervalo.

Apenas eventos que terminaram antes da data de início ou que começam após a data de término devem ser ignorados.

Portanto, o filtro perfeito é tão simples quanto:

Event.StartDate <= FilterEndDate e Event.EndDate >= FilterStartDate

Se a regra for “todo o evento está dentro do intervalo”, as combinações válidas são menos.

E o filtro é quase o mesmo:

Event.StartDate >= FilterStartDate and Event.EndDate <= FilterEndDate

Podes precisar de adaptá-lo um pouco para incluir o DateTimeToDate como explicado anteriormente, mas é apenas um pequeno detalhe. Com essa “mentalidade de dois filtros”, podes fazer qualquer coisa.

Publicar comentário