मैं तर्क दूंगा कि इस विशिष्ट उद्देश्य के लिए नीचे दी गई क्वेरी एक समर्पित लुकअप तालिका का उपयोग करने के रूप में कुशल है।
DECLARE @start DATE, @end DATE;
SELECT @start = '20110714', @end = '20110717';
;WITH n AS
(
SELECT TOP (DATEDIFF(DAY, @start, @end) + 1)
n = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
)
SELECT 'Bob', DATEADD(DAY, n-1, @start)
FROM n;
परिणाम:
DECLARE @t TABLE
(
Member NVARCHAR(32),
RegistrationDate DATE,
CheckoutDate DATE
);
INSERT @t SELECT N'Bob', '20110714', '20110717'
UNION ALL SELECT N'Sam', '20110712', '20110715'
UNION ALL SELECT N'Jim', '20110716', '20110719';
;WITH [range](d,s) AS
(
SELECT DATEDIFF(DAY, MIN(RegistrationDate), MAX(CheckoutDate))+1,
MIN(RegistrationDate)
FROM @t -- WHERE ?
),
n(d) AS
(
SELECT DATEADD(DAY, n-1, (SELECT MIN(s) FROM [range]))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS s(n)
WHERE n <= (SELECT MAX(d) FROM [range])
)
SELECT t.Member, n.d
FROM n CROSS JOIN @t AS t
WHERE n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;
----------^^^^^^^ not many cases where I'd advocate between!
:
Bob 2011-07-14
Bob 2011-07-15
Bob 2011-07-16
Bob 2011-07-17
मुमकिन है कि आप इस एक सेट के रूप में, एक भी सदस्य के लिए नहीं है, इसलिए यहां की आवश्यकता होगी इस तकनीक अनुकूल करने के लिए एक रास्ता है
परिणाम:
Member d
-------- ----------
Bob 2011-07-14
Bob 2011-07-15
Bob 2011-07-16
Bob 2011-07-17
Sam 2011-07-12
Sam 2011-07-13
Sam 2011-07-14
Sam 2011-07-15
Jim 2011-07-16
Jim 2011-07-17
Jim 2011-07-18
Jim 2011-07-19
रूप @Dems कहे अनुसार, इस के लिए सरल किया जा सकता है: मैं आम तौर पर कुछ मेज पर एक चाल का उपयोग कर ROW_NUMBER() के साथ ऐसा कर
;WITH natural AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 AS val
FROM sys.all_objects
)
SELECT t.Member, d = DATEADD(DAY, natural.val, t.RegistrationDate)
FROM @t AS t INNER JOIN natural
ON natural.val <= DATEDIFF(DAY, t.RegistrationDate, t.CheckoutDate);
एक नज़र यहाँ है http://stackoverflow.com/questions/1478951/tsql-generate-a-resultset-of-incrementing-dates [1]: http: // stackoverflow ।कॉम/प्रश्न/1478951/tsql-gener-a-resultet-of-incrementing-date – StoicFnord
आम तौर पर, आप नहीं करते हैं। आपके पास एक लुक-अप टेबल है और उन्हें वहां से बाहर निकालें। 'Calendar.date> = user.start_date और calendar.date <= user.leave_date' आप * लूप, या रिकर्सिव क्वेरी का उपयोग करके सेट जेनरेट कर सकते हैं, लेकिन वे लुक-अप टेबल का उपयोग करने के जितना तेज़ नहीं होते हैं। – MatBailie
मैंने एक बहुत ही समान सवाल पूछा, लेकिन मेरा समय घंटों तक नहीं था। आप अपनी ज़रूरत को आसानी से फिट करने के लिए बदल सकते हैं। http://stackoverflow.com/questions/10986344/get-every-hour-for-a-time-range – Limey