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