2016-12-29 5 views
5

कोड:T-SQL - एक सीमा के बीच छानने का दिनांक

DECLARE @T1 TABLE ([ID] INT, [WD] DATE, [SD] DATETIME, [ED] DATETIME, [Val] INT) 
INSERT INTO @T1 ([ID], [WD], [SD], [ED], [VAL]) 
VALUES (1, '2016-02-14', '2016-02-14 08:00:00', '2016-02-14 16:30:00', 12) 
     ,(1, '2016-02-14', '2016-02-16 08:00:00', '2016-02-16 16:30:00', 15) 
     ,(3, '2016-02-14', '2016-02-16 08:00:00', '2016-02-16 16:30:00', 12) 
     ,(1, '2016-02-21', '2016-02-22 08:00:00', '2016-02-22 16:30:00', 100) 
     ,(2, '2016-02-21', '2016-02-25 08:00:00', '2016-02-25 16:30:00', 124) 
     ,(3, '2016-03-20', '2016-03-21 08:00:00', '2016-03-21 16:30:00', 10) 
     ,(3, '2016-04-17', '2016-04-17 08:00:00', '2016-04-17 16:30:00', 8); 

DECLARE @StartDate DATE 
     , @EndDate DATE; 

SELECT @StartDate = MIN(WD) FROM @T1 
SELECT @EndDate = DATEADD(DAY,6,MAX(WD)) FROM @T1; 

DECLARE @T2 TABLE (D DATE) -- Table generated to get ALL dates between the minium WD (Min Sunday) and 6 days after the maximum WD (Max Sunday + 6 days to complete the week date range) 
INSERT INTO @T2 ([D]) 
SELECT DATEADD(DAY, NBR - 1, @StartDate) 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS NBR 
      FROM sys.columns c 
     ) NBR 
WHERE NBR - 1 <= DATEDIFF(DAY, @StartDate, @EndDate); 

SELECT * FROM @T1; 
SELECT * FROM @T2; 

विवरण: @ T1 विशिष्ट तिथियों के साथ पहले से स्रोत डेटा तालिका जहां [आईडी] = किसी प्रकार की एक आईडी क्षेत्र, [है डब्ल्यूडी] = सप्ताह की अलग शुरुआत (रविवार), [एसडी] = उस दिन [डब्ल्यूडी] सप्ताह के भीतर एक दिन की शुरूआत, [ईडी] = उस दिन [डब्ल्यूडी] सप्ताह के भीतर एक दिन का अंत, [वैल] = कुछ निर्दिष्ट मूल्य वह आईडी/डब्ल्यूडी/एसडी/ईडी रिकॉर्ड

@ टी 2 वह तालिका है जिसे मैं परिभाषित कर रहा हूं और MIN ([WD]) और MAX ([WD]) + 6 दिनों के भीतर सभी तिथियां प्राप्त करने के लिए पॉपुलटिंग कर रहा हूं (सप्ताह)

लक्ष्य:

उन [आईडी]/[डब्ल्यूडी] सप्ताहों के लिए किसी भी अनुपलब्ध तिथियों के साथ @ टी 1 डेटा लौटाएं। (बेहतर समझ के लिए वांछित आउटपुट को देखें)

वांछित परिणाम (एक्सेल से नकल तो प्रारूप अलग है, लेकिन वह ठीक है)

[ID][WD]  [SD]   [ED]   [Val] 
1 2/14/2016 2/14/16 8:00 2/14/16 16:30 12 
1 2/14/2016 2/15/16 00:00 2/15/16 00:00 NULL 
1 2/14/2016 2/16/16 8:00 2/16/16 16:30 15 
1 2/14/2016 2/17/16 00:00 2/17/16 00:00 NULL 
1 2/14/2016 2/18/16 00:00 2/18/16 00:00 NULL 
1 2/14/2016 2/19/16 00:00 2/19/16 00:00 NULL 
1 2/14/2016 2/20/16 00:00 2/20/16 00:00 NULL 
3 2/14/2016 2/14/16 00:00 2/14/16 00:00 NULL 
3 2/14/2016 2/15/16 00:00 2/15/16 00:00 NULL 
3 2/14/2016 2/16/16 8:00 2/16/16 16:30 12 
3 2/14/2016 2/17/16 00:00 2/17/16 00:00 NULL 
3 2/14/2016 2/18/16 00:00 2/18/16 00:00 NULL 
3 2/14/2016 2/19/16 00:00 2/19/16 00:00 NULL 
3 2/14/2016 2/20/16 00:00 2/20/16 00:00 NULL 
1 2/21/2016 2/21/16 00:00 2/21/16 00:00 NULL 
1 2/21/2016 2/22/16 8:00 2/22/16 16:30 100 
1 2/21/2016 2/23/16 00:00 2/23/16 00:00 NULL 
1 2/21/2016 2/24/16 00:00 2/24/16 00:00 NULL 
1 2/21/2016 2/25/16 00:00 2/25/16 00:00 NULL 
1 2/21/2016 2/26/16 00:00 2/26/16 00:00 NULL 
1 2/21/2016 2/27/16 00:00 2/27/16 00:00 NULL 
2 2/21/2016 2/21/16 00:00 2/21/16 00:00 NULL 
2 2/21/2016 2/22/16 00:00 2/22/16 00:00 NULL 
2 2/21/2016 2/23/16 00:00 2/23/16 00:00 NULL 
2 2/21/2016 2/24/16 00:00 2/24/16 00:00 NULL 
2 2/21/2016 2/25/16 8:00 2/25/16 16:30 124 
2 2/21/2016 2/26/16 00:00 2/26/16 00:00 NULL 
2 2/21/2016 2/27/16 00:00 2/27/16 00:00 NULL 
3 3/20/2016 3/20/16 00:00 3/20/16 00:00 NULL 
3 3/20/2016 3/21/16 8:00 3/21/16 16:30 10 
3 3/20/2016 3/22/16 00:00 3/22/16 00:00 NULL 
3 3/20/2016 3/23/16 00:00 3/23/16 00:00 NULL 
3 3/20/2016 3/24/16 00:00 3/24/16 00:00 NULL 
3 3/20/2016 3/25/16 00:00 3/25/16 00:00 NULL 
3 3/20/2016 3/26/16 00:00 3/26/16 00:00 NULL 
3 4/17/2016 4/17/16 8:00 4/17/16 16:30 8 
3 4/17/2016 4/18/16 00:00 4/18/16 00:00 NULL 
3 4/17/2016 4/19/16 00:00 4/19/16 00:00 NULL 
3 4/17/2016 4/20/16 00:00 4/20/16 00:00 NULL 
3 4/17/2016 4/21/16 00:00 4/21/16 00:00 NULL 
3 4/17/2016 4/22/16 00:00 4/22/16 00:00 NULL 
3 4/17/2016 4/23/16 00:00 4/23/16 00:00 NULL 

मैं पार में शामिल होने और सामान लेकिन उपयोग करने की कोशिश हो रही है वांछित के साथ कोई किस्मत उत्पादन।

उत्तर

3

मैं हटाया आपके @ टी 2 और उपयोग अपने इसके बजाय @ टी 3।

DECLARE @T1 TABLE ([ID] INT, [WD] DATE, [SD] DATETIME, [ED] DATETIME, [Val] INT) 
INSERT INTO @T1 ([ID], [WD], [SD], [ED], [VAL]) 
VALUES (1, '2016-02-14', '2016-02-14 08:00:00', '2016-02-14 16:30:00', 12) 
     ,(1, '2016-02-14', '2016-02-16 08:00:00', '2016-02-16 16:30:00', 15) 
     ,(3, '2016-02-14', '2016-02-16 08:00:00', '2016-02-16 16:30:00', 12) 
     ,(1, '2016-02-21', '2016-02-22 08:00:00', '2016-02-22 16:30:00', 100) 
     ,(2, '2016-02-21', '2016-02-25 08:00:00', '2016-02-25 16:30:00', 124) 
     ,(3, '2016-03-20', '2016-03-21 08:00:00', '2016-03-21 16:30:00', 10) 
     ,(3, '2016-04-17', '2016-04-17 08:00:00', '2016-04-17 16:30:00', 8); 

DECLARE @T3 TABLE ([ID] INT, [WD] DATE, [SD] DATETIME, [ED] DATETIME); 
WITH cte AS (
SELECT DISTINCT ID, WD 
FROM 
    @T1 
) 
INSERT INTO @T3 (ID, WD, SD, ED) 
SELECT ID, WD, DATEADD(DAY,n,WD), DATEADD(DAY,n,WD) 
FROM 
    cte 
    CROSS JOIN (VALUES (0),(1),(2),(3),(4),(5),(6)) AS ADDED(n); 

SELECT t3.ID, t3.WD,COALESCE(t1.SD,t3.SD) AS SD, COALESCE(t1.ED,t3.ED) AS ED, t1.Val 
FROM @T3 t3 
    LEFT JOIN @T1 t1 ON t3.ID=t1.ID AND CONVERT(DATE,t1.SD)=CONVERT(DATE,t3.SD) 
+0

इस रचनात्मक एसएलएन के लिए धन्यवाद। यह अपेक्षित डेटा देता है। :) – 007

2

यह आपके द्वारा बनाए गए समयरेखा के विरुद्ध आपके स्रोत डेटा का बायां हिस्सा होगा।

मैं यह पता लगाने सकता है नहीं कैसे आईडी निर्दिष्ट नहीं की, लेकिन जब मैं COALESCE का उपयोग लापता मूल्यों को भरने के लिए इस अपने वांछित निर्गम (आईडी को छोड़कर) देता है:

SELECT [t1].[ID] 
     ,COALESCE([t1].[WD], DATEADD(DAY, 1 - DATEPART(WEEKDAY, [t2].[D]), [t2].[D])) AS WD 
     ,COALESCE([t1].[SD], [t2].[D]) AS SD 
     ,COALESCE([t1].[ED], [t2].[D]) AS ED 
     ,[t1].[Val] 
FROM @T2 [t2] 
LEFT JOIN @T1 [t1] 
ON  [t2].[D] = CONVERT(DATE, [t1].[SD]); 
+0

इस एसएलएन के लिए धन्यवाद। यह भविष्य में एक अलग कार्य के लिए उपयोगी हो जाएगा। :) – 007

संबंधित मुद्दे