This seems to work as well:CREATE TABLE #SampleData (
DayOne varchar(9) NOT NULL,
DayTwo varchar(9) NOT NULL
);
CREATE CLUSTERED INDEX NDX_TEMP_SampleData_DayTwo_DayOne_ ON #SampleData
(
DayTwo ASC,
DayOne ASC
);
INSERT INTO #SampleData (DayOne, DayTwo)
SELECT X.DayOne, X.DayTwo
FROM (
VALUES ('Monday', 'Friday'),
('Tuesday', 'Wednesday'),
('Friday', 'Monday')
) AS X (DayOne, DayTwo);
CREATE TABLE #TwoWeeks (
ID int UNIQUE NOT NULL,
TheDate date NOT NULL,
WeekDayName varchar(9) NOT NULL
);
CREATE UNIQUE CLUSTERED INDEX UCDX_TEMP_TwoWeeks_WeekDayName_TheDate ON #TwoWeeks
(
WeekDayName ASC,
TheDate ASC
);
SET NOCOUNT ON;
PRINT CONVERT(varchar(30), SYSDATETIME()) + ' - Query Start';
INSERT INTO #TwoWeeks (ID, TheDate, WeekDayName)
SELECT X.ID, X.TheDate, X.WeekDayName
FROM (
VALUES ( 1, '1900-01-01', 'Monday'),
( 2, '1900-01-02', 'Tuesday'),
( 3, '1900-01-03', 'Wednesday'),
( 4, '1900-01-04', 'Thursday'),
( 5, '1900-01-05', 'Friday'),
( 6, '1900-01-06', 'Saturday'),
( 7, '1900-01-07', 'Sunday'),
( 8, '1900-01-08', 'Monday'),
( 9, '1900-01-09', 'Tuesday'),
(10, '1900-01-10', 'Wednesday'),
(11, '1900-01-11', 'Thursday'),
(12, '1900-01-12', 'Friday'),
(13, '1900-01-13', 'Saturday'),
(14, '1900-01-14', 'Sunday')
) AS X (ID, TheDate, WeekDayName);
SELECT SD.DayOne, SD.DayTwo, D2.ID - D1.ID AS DaysBetween
FROM #SampleData AS SD
CROSS APPLY (
SELECT TOP (1) TW.ID, TW.TheDate
FROM #TwoWeeks AS TW
WHERE TW.WeekDayName = SD.DayOne
ORDER BY TW.TheDate
) AS D1
CROSS APPLY (
SELECT TOP (1) TW.ID
FROM #TwoWeeks AS TW
WHERE TW.WeekDayName = SD.DayTwo
AND TW.TheDate > D1.TheDate
ORDER BY TW.TheDate
) AS D2
PRINT CONVERT(varchar(39), SYSDATETIME()) + ' - Query Complete';
DROP TABLE #SampleData;
DROP TABLE #TwoWeeks;
The query portion runs in roughly 15.6 ms, and consistently. Your mileage may vary.
Steve (aka sgmunson) 🙂 🙂 🙂
Rent Servers for Income (picks and shovels strategy)