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