Pour chaque jour entre deux dates, ajoutez une ligne avec les mêmes informations mais seulement ce jour dans les colonnes de début / fin

J'ai une table, avec les types varchar , datetime , datetime :

 NAME | START | END Bob | 10/30 | 11/2 

Qu'est-ce qu'une requête SQL puis-je searchr pour savoir comment faire de cette table?

 NAME | START | END Bob | 10/30 | 10/30 Bob | 10/31 | 10/31 Bob | 11/01 | 11/01 Bob | 11/02 | 11/02 

Ceci est seulement couru une fois, et sur un très petit set de données. L'optimization n'est pas nécessaire.

Peut-être avez-vous besoin d'un Recursive CTE .

 CREATE TABLE #dates(NAME VARCHAR(50),START DATETIME,[END] DATETIME) INSERT INTO #dates VALUES ('Bob','2014-10-30','2014-11-02') DECLARE @maxdate DATETIME = (SELECT Max([end]) FROM #dates); WITH cte AS (SELECT NAME, START, [END] FROM #dates UNION ALL SELECT NAME, Dateadd(day, 1, start), Dateadd(day, 1, start) FROM cte WHERE start < @maxdate) SELECT * FROM cte 

SORTIE:

 name START END ---- ---------- ---------- Bob 2014-10-30 2014-10-30 Bob 2014-10-31 2014-10-31 Bob 2014-11-01 2014-11-01 Bob 2014-11-02 2014-11-02 

Vous pouvez le faire avec un cte récursif:

 ;with cte AS (SELECT Name,Start,[End] FROM YourTable UNION ALL SELECT Name ,DATEADD(day,1,Start) ,[End] FROM cte WHERE Start < [End]) SELECT Name, Start, Start AS [End] FROM cte 

Cependant, je suggère de créer une table de calendar et de s'y joindre:

 SELECT a.Name,b.CalendarDate AS Start, b.CalendarDate AS [End] FROM YourTable a JOIN tlkp_Calendar b ON b.CalendarDate BETWEEN a.[Start] AND a.[End] 

Démo des deux requêtes: SQL Fiddle

 ;WITH dates AS (SELECT (SELECT MIN(start) from table) as date, UNION ALL SELECT Dateadd(day, 1, date), FROM dates WHERE date < (SELECT MAX(end) from table)) SELECT name, date as start, date as end from table RIGHT JOIN dates on date between start and end