J'ai deux tables dont les deux ont des colonnes StartDate et EndDate. J'essaie de renvoyer un seul jeu de résultats contenant toutes les plages de dates d'une table (TableA) et toutes les plages de dates complémentaires de l'autre (TableB).Trouver des plages de dates de complément?
CREATE TABLE [dbo].[TableA](
[ID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL
)
CREATE TABLE [dbo].[TableB](
[ID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL
)
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(1, '4/1/2009', '8/1/2009')
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(1, '10/1/2009', '12/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(1, '1/1/2009', '2/1/2010')
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(2, '4/1/2009', '8/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(2, '1/1/2009', '5/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(2, '7/1/2009', '12/1/2009')
Le jeu de résultats attendus des trois ensembles de données devrait être:
(ID = 1)
1/1/2009 - 4/1/2009 (from TableB)
4/1/2009 - 8/1/2009 (from TableA)
8/1/2009 - 10/1/2009 (from TableB)
10/1/2009 - 12/1/2009 (from TableA)
12/1/2009 - 2/1/2010 (from TableB)
(ID = 2)
1/1/2009 - 4/1/2009 (from TableB)
4/1/2009 - 8/1/2009 (from TableA)
8/1/2009 - 12/1/2009 (from TableB)
Les plages de dates ne sont pas garantis d'être continue, et je ne peux pas faire des hypothèses sur la façon dont ils se chevauchent entre les tables ... dans chaque tableau, on peut supposer qu'ils ne se chevauchent pas.
Je n'arrive pas à comprendre comment diviser les plages de dates uniques de la TableB en plusieurs parties pour trouver toutes les «régions» complémentaires en SQL.
Quelqu'un a des suggestions?
définir 'complément' dans ce contexte. –
Combien de rangs avez-vous? La performance est-elle un problème? –
Je pense qu'il veut dire qu'il veut toutes les lignes de A, plus toutes les parties de périodes dans B qui ne chevauchent aucune période dans A. En d'autres termes: 'Une union (B moins (B intersection A))', de sorte que A et B 'sont disjoints et' A union B '== A union B'. –