Sto correndo su un blocco stradale per un problema più grande.Controllo della sovrapposizione dell'intervallo di tempo, il problema del watchman [SQL]
Come parte di una query di grandi dimensioni, ho bisogno di risolvere un problema di "guardiano notturno". Ho una tabella con cambiamenti di programma come tale:
ID | Start | End
1 | 2009-1-1 06:00 | 2009-1-1 14:00
2 | 2009-1-1 10:00 | 2009-1-1 18:00
3 | 2009-2-1 20:00 | 2009-2-2 04:00
4 | 2009-2-2 06:00 | 2009-2-2 14:00
Come parte di una query, ho bisogno di determinare se v'è almeno 1 sentinella in una camera in qualsiasi momento per un determinato intervallo di tempo.
Quindi, se ho specificato la gamma 2009-1-1 06:00
al 2009-1-1 12:00
, il risultato è vero, perché turni 1 e 2 si fondono per coprire questo periodo di tempo - di fatto qualsiasi numero di turni potrebbe essere incatenato a tenere l'orologio in su. Tuttavia se ho controllato 2009-2-1 22:00
a 2009-1-2 10:00
, il risultato è falso perché c'è una pausa tra 4 e 6 del mattino seguente.
vorrei implementare questa sia in LINQ, o come una funzione definita dall'utente in SQL Server (2005), poiché in entrambi i casi questa è solo una parte della logica di una query grande che deve essere eseguito per identificare gli elementi che richiedono attenzione. Il set di dati reale coinvolge circa un centinaio di record di turni che intersecano un determinato periodo di tempo, ma non sempre coprono l'intero intervallo.
Il più vicino che ho trovato è How to group ranged values using SQL Server per serie di numeri, ma dipende da ogni gamma terminando poco prima della gamma prossime partenze. Se potessi costruire la stessa visione unificata degli orologi, prendendo in considerazione solo orologi sovrapposti, sarebbe banale controllare se un tempo specifico fosse coperto. Una visione unificata sarebbe simile a questa:
Start | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00
Nota: Tutta questa faccenda sarebbe relativamente facile da implementare, semplicemente tirando tutti i dati e l'uso di alcuni ciclo manuale su di esso, tuttavia, che è il sistema attuale, e la sua piuttosto lento a causa del numero di turni e del numero di intervalli di tempo che devono essere controllati.
L'intervallo di date non deve essere impostato su "Quindi, se si specifica l'intervallo 2009-1-1 12:00 a 2009-1-1 06:00", si inverta a "2009-1-1 06:00 a 2009-1-1 12:00 "? – Sung
@David Potrebbe essere utile scaricare questo ebook: "Sviluppo di applicazioni database orientate al tempo in SQL" (http://www.cs.arizona.edu/people/rts/tdbbook.pdf). Ha un sacco di buone informazioni su query SQL complesse su tabelle con intervalli di date. –
+1 - Sto lavorando su un problema simile, identificando disgiunti e sovrapposizioni – spencer7593