2015-09-23 7 views
5

क्या उपयोगकर्ता के आधार पर डेटाटाइम ओवरलैप करने वाले सभी रिकॉर्ड वापस खींचने का कोई तरीका है?सभी पंक्तियां खोजें जहां प्रारंभ तिथि पूर्व समाप्ति तिथि से पहले है

उदाहरण के लिए;

टैबलेट में निम्नलिखित पंक्तियां हैं;

TrainerID   StartTime   EndTime 
1234     10-1-2015 08:30  10-1-2015 09:00 
1234     10-1-2015 08:45  10-1-2015 09:15 
1234     10-1-2015 09:30  10-1-2015 10:00 
2345     10-1-2015 08:45  10-1-2015 09:15 
2345     10-1-2015 09:30  10-1-2015 10:00 

मैं एक प्रश्न है कि केवल निम्नलिखित रिकॉर्ड खींच सकते हैं की जरूरत है, क्योंकि यह शुरू है समय से पहले ट्रेनर (डबल बुक) के लिए पिछले अंत समय:

1234     10-1-2015 08:45  10-1-2015 09:15 

उत्तर

2

अस्तित्व नीचे कोड आपको लगता है कि इस सवाल का जवाब देना चाहिए। कोड सुनिश्चित करता है कि संघर्ष सूची का प्रारंभ समय मुख्य सूची प्रविष्टि की शुरुआत से पहले है जबकि संघर्ष की प्रारंभ समय मेल सूची प्रविष्टि के प्रारंभ समय के बाद भी है।

SELECT * 
FROM tblTest clashing 
WHERE EXISTS 
(
    SELECT 1 
    FROM tblTest mainlist 
    WHERE clashing.trainderid = mainlist.trainderid 
     AND clashing.starttime < mainlist.endtime 
     AND clashing.starttime > mainlist.starttime 
) 

यह भी एक में बयान के साथ लिखा जा सकता है, लेकिन मौजूद ज्यादा कुशल है

1

ओवरलैप हुई तिथियों को निकालने के लिए उपयोग कर सकते हैं :

Demo

CREATE TABLE #TABLEA(TrainerID INT, StartDate DATETIME, EndDate DATETIME); 

INSERT INTO #TABLEA 
SELECT 1234, '10-1-2015 08:30', '10-1-2015 09:00' 
UNION ALL SELECT 1234 , '10-1-2015 08:45', '10-1-2015 09:15' 
UNION ALL SELECT 1234 , '10-1-2015 09:30', '10-1-2015 10:00' 
UNION ALL SELECT 2345 , '10-1-2015 08:45', '10-1-2015 09:15' 
UNION ALL SELECT 2345 , '10-1-2015 09:30', '10-1-2015 10:00'; 

SELECT 
    D.TrainerID, 
    [StartTime] = D.StartDate, 
    [EndTime] = (SELECT MIN(E.EndDate) 
       FROM #TABLEA E 
       WHERE E.EndDate >= D.EndDate 
       AND E.TrainerID = D.TrainerID 
       AND NOT EXISTS (SELECT 1 
           FROM #TABLEA E2 
           WHERE E.StartDate < E2.StartDate 
            AND E.EndDate > E2.StartDate 
            AND E.TrainerID = E2.TrainerID)) 
FROM #TABLEA D 
WHERE NOT EXISTS (SELECT 1 
        FROM #TABLEA D2 
        WHERE D.StartDate < D2.EndDate 
        AND D.EndDate > D2.EndDate 
        AND D.TrainerID = D2.TrainerID); 
1

आप आवश्यक पंक्ति प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं, हालांकि अगली ट्रेनर आईडी से आपकी तर्क पंक्ति के आधार पर (यानी। 2345) भी

DECLARE @Trainers TABLE 
(
    TrainerId INT, 
    Start_Time datetime, 
    End_Time datetime 
) 
INSERT INTO @Trainers VALUES 
(1234,'10-1-2015 08:30','10-1-2015 09:00 '), 
(1234,'10-1-2015 08:45','10-1-2015 09:15'), 
(1234,'10-1-2015 09:30','10-1-2015 10:00'), 
(2345 ,' 10-1-2015 08:45','10-1-2015 09:15'), 
(2345 ,' 10-1-2015 09:30 ',' 10-1-2015 10:00') 


;WITH TrainersTemp AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY trainerid) AS rn 
     FROM @Trainers 
     ) 
SELECT CX.TrainerId, CX.Start_Time, CX.End_Time 
FROM TrainersTemp CX JOIN TrainersTemp CY 
ON  CX.rn = CY.rn + 1 
WHERE CY.End_Time < CX.Start_Time 

Demo योग्य हो जाएगा (एसक्यूएल बेला नीचे फिर से है)

या यदि आप दोषपूर्ण एक को छोड़कर सभी पंक्तियों देखना चाहते हैं तो नीचे दिए गए कोड का उपयोग

;WITH TrainersTempAll AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY trainerid) AS rn 
     FROM @Trainers 
     ) 
SELECT CX.TrainerId, CX.Start_Time, CX.End_Time 
FROM TrainersTempAll CX JOIN TrainersTempAll CY 
ON  CX.rn = CY.rn + 1 
+0

ट्रेनर "2345" हालांकि बुक डबल नहीं है, तो मैं उस पंक्ति को खींचने के लिए नहीं करना चाहती। यह मेरी समस्या है; मैं सभी पंक्तियों को खींचता रहता हूं, जब मुझे केवल तभी देखभाल होती है जब एक ट्रेनर को किसी निश्चित तारीख पर डबल बुक किया जाता है। – akaWizzmaster

1

सबसे पहले आप ट्रेनर आईडी और स्टार्ट_टाइम द्वारा सॉर्ट करना चाहिए। और फिर सही स्थिति के साथ दो तालिकाओं में शामिल हों।

इस क्वेरी का प्रयास करें:

;WITH TrainersTemp AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY trainerid, Start_Time) AS row_num 
    FROM Trainers 
) 
select t2.* from TrainersTemp t1 
join TrainersTemp t2 on t1.TrainerId = t2.TrainerId and t1.row_num = t2.row_num-1 
where t2.Start_Time<t1.End_Time 
1

आप SQL Server 2012 का उपयोग के रूप में आप LAG समारोह है, जो की संभावना अधिक कुशल से आत्म में शामिल होने होगा उपयोग कर सकते हैं। क्वेरी भी बहुत सरल हो जाती है।

प्रत्येक पंक्ति के लिए LAG आपको पिछली पंक्ति से EndTime (TrainerID द्वारा विभाजित) देता है। फिर पिछली पंक्ति से EndTime के साथ वर्तमान पंक्ति से StartTime की तुलना करें।

SQL Fiddle

WITH 
CTE 
AS 
(
    SELECT 
    TrainerID 
    ,StartTime 
    ,EndTime 
    ,LAG(EndTime) OVER(PARTITION BY TrainerID ORDER BY StartTime) AS PrevEndTime 
    FROM TableA 
) 
SELECT 
    TrainerID 
    ,StartTime 
    ,EndTime 
FROM CTE 
WHERE StartTime < PrevEndTime 
; 

परिणाम:

| TrainerID |     StartTime |     EndTime | 
|-----------|---------------------------|---------------------------| 
|  1234 | October, 01 2015 08:45:00 | October, 01 2015 09:15:00 | 
संबंधित मुद्दे