Come determinare se un intervallo di date si verifica ogni volta all'interno di un altro intervallo di date?

StackOverflow https://stackoverflow.com/questions/730722

  •  06-09-2019
  •  | 
  •  

Domanda

Ho una tabella di eventi che specifica un intervallo di date con campi start_date e end_date. Ho un altro intervallo di date, specificati nel codice, che definisce la settimana corrente come 'Inizio_settimana' e 'week_end'.

Mi piacerebbe interrogare tutti gli eventi per la settimana. I casi sembrano essere:

  • Evento inizia e termina entro la settimana
  • evento inizia prima della settimana, ma finisce entro la settimana
  • Evento inizia entro la settimana, ma finisce dopo la settimana
  • Evento inizia prima della settimana e anche si conclude dopo la settimana
  • Eventi che né risiedono all'interno, né si sovrappongono settimana a tutti vengono ignorati

Sto cercando di venire con una query in grado di gestire tutti questi casi. Finora sono stato in grado di ottenere i casi che gestiscono le sovrapposizioni settimana, o gli eventi che sono pienamente solo interno; In sostanza, troppi record, o del tutto assenti.

È stato utile?

Soluzione

(event.start BETWEEN week.start AND week.end)
OR
(week.start BETWEEN event.start AND event.end)

In parole semplici, sia di una settimana inizia durante l'evento, o un evento inizia durante la settimana.

Andiamo a controllare:

  

Evento inizia e termina entro la settimana

L'evento inizia durante la settimana.

  

evento inizia prima della settimana, ma finisce entro la settimana

La settimana inizia durante l'evento.

  

Evento inizia entro la settimana, ma finisce dopo la settimana

L'evento inizia durante la settimana.

  

Evento inizia prima della settimana e anche si conclude dopo la settimana

La settimana inizia durante l'evento.

Si noti che BETWEEN nelle espressioni sopra è utilizzato solo per brevità.

espressione Strict assomiglia a questo:

(event.start >= week.start AND event.start < week.end)
OR
(week.start >= event.start AND week.start < event.end)

, a condizione che week.end è un week.start + INTERVAL 7 DAY.

I. e. se voi settimana inizia di Sun, 0:00:00, allora dovrebbe terminare il next Sun, 0:00:00 (non su Sat, 0:00:00)

Questa espressione sembra più complesso di quello che viene comunemente utilizzato:

event.start < week.end AND event.end > week.start

, ma il primo è più efficiente e l'indice accogliente.

Vedi questi articoli nel mio blog per il confronto delle prestazioni:

Altri suggerimenti

Si potrebbe scrivere il vostro stato in questo modo:

start_date <= week_end AND end_date >= week_start

Edit: questo presuppone start_date <= data_finale e Inizio_settimana <= week_end (siano adeguatamente ordinato) e ti dà le migliori prestazioni sulla maggior parte delle implementazioni db a causa di non utilizzare o (che su alcuni database possono creare problemi di prestazioni)

Edit2:. Questa soluzione risolve anche il problema di eventi che iniziano prima dell'intervallo e alla fine dopo l'intervallo

1 per il pop Catalin, ma purtroppo non ho il privilegio di voto.

La condizione limitare che si desidera è semplicemente il modo standard per esprimere Allen "OVERLAPS" operatore.

Ulteriori SQL avvertimento:. Se data_finale è annullabile, essere sicuri di trattare i null in quelle colonne come "alla fine dei tempi"

Ulteriori avvertimento funzionale:. Essere sicuri di adattare l'utilizzo di '<=' contro '<' o meno i periodi di tempo registrate includono la data di fine o no

Al fine ...

where start_date >= week_start and end_date <= week_end
where start_date <= week_start and end_date >= week_start and end_date <= week_end
where start_date >= week_start and start_date <= week_end and end_date > week_end
where start_date < week_start and end_date > week_end

(FINE2> = start1) && (start2 <= END1) Penso che sarebbe tornato vero per eventuali intervalli di date che si intersecano.

Ho trovato una discussione su questo qui che ho trovato utili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top