Je suis en cours d'exécution dans un blocage sur un problème plus important.Vérification du chevauchement de plage de temps, le problème watchman [SQL]
Dans le cadre d'une grande requête, j'ai besoin de résoudre un problème "veilleur de nuit". J'ai une table avec des changements de calendrier en tant que tel:
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
Dans le cadre d'une requête, je dois déterminer s'il y a au moins 1 gardien dans une chambre en tout temps pour un intervalle de temps donné. Donc, si j'ai spécifié la plage 2009-1-1 06:00
à 2009-1-1 12:00
, le résultat est vrai, car les décalages 1 et 2 fusionnent pour couvrir cette période. En fait, n'importe quel nombre de décalages pourrait être enchaîné pour maintenir la veille. Cependant si j'ai vérifié 2009-2-1 22:00
à 2009-1-2 10:00
, le résultat est faux car il y a une coupure entre 4 et 6h le matin suivant.
Je voudrais implémenter ce soit dans LINQ, soit comme une fonction définie par l'utilisateur dans SQL Server (2005), car dans les deux cas, cela fait juste partie de la logique d'une requête plus grande qui doit être exécutée sur identifier les éléments qui ont besoin d'attention. Le jeu de données réel implique une centaine d'enregistrements de quart qui se croisent à n'importe quelle période donnée, mais qui ne couvrent pas toujours toute la gamme.
Le plus proche que j'ai trouvé est How to group ranged values using SQL Server pour les plages de numéros, mais cela dépend de chaque plage se terminant juste avant le début de la plage suivante. Si je pouvais construire la même vue unifiée des montres, en ne prenant en considération que les montres qui se chevauchent, il serait alors trivial de vérifier si une heure spécifique était couverte. Une vue unifiée ressemblerait à ceci:
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
Note: Toute cette affaire serait relativement facile à mettre en œuvre simplement en tirant toutes les données et en cours d'exécution une boucle manuelle là-dessus, mais qui est le système actuel, et son plutôt lent en raison du nombre de changements et du nombre de plages de temps à vérifier.
Ne pas indiquer de plage de dates dans "Si j'ai spécifié la plage 2009-1-1 12:00 à 2009-1-1 06:00" à "2009-1-1 06:00 à 2009-1-1 12:00 "? – Sung
@David Vous pouvez télécharger cet ebook: "Développement d'applications de base de données orientées temporelles en SQL" (http://www.cs.arizona.edu/people/rts/tdbbook.pdf). Il a beaucoup de bonnes informations sur les requêtes SQL complexes sur les tables avec des plages de dates. –
+1 - Je travaille sur un problème similaire, en identifiant les disjoints ET les chevauchements – spencer7593