मुझे हाल ही में नियोजन की तिथियों के बीच अंतर खोजने के लिए काम सौंपा गया था, जहां एक अंतर को एक नौकरी के अंत से 30 दिनों से अधिक समय की अवधि के रूप में परिभाषित किया गया है अगले, और कहा कि सूट करने के लिए एक प्रश्न के साथ आ पा रहा था की, नीचे देखें:एसक्यूएल सर्वर - ओवरलैपिंग तिथियों को शामिल करने वाली तिथियों के बीच अंतराल खोजें
WITH GapsInEmployment AS
(
SELECT
-1 AS DriverQualificationApplicationEmploymentGapId
,E1.DriverQualificationApplicationId
,E1.EndDate AS EmploymentGapBeginDate
,E2.StartDate AS EmploymentGapEndDate
,(
CASE
WHEN ISNULL(DATEDIFF(DD, E1.EndDate, E2.StartDate), 0) < 0 THEN 0
ELSE DATEDIFF(DD, E1.EndDate, E2.StartDate)
END
) AS DaysLapsedBetweenEmployment
,NULL AS ReasonForEmploymentGap
FROM @EmploymentGapInfo E1
LEFT JOIN @EmploymentGapInfo E2
ON E1.RowNum = E2.RowNum - 1
)
SELECT *
FROM GapsInEmployment
WHERE DaysLapsedBetweenEmployment > 30;
मैं, एक रिकॉर्ड की तुलना कर रहा हूँ अगले रिकॉर्ड करने के लिए, 30 के एक चूक हो, तो देखने के लिए पहले रिकॉर्ड की समाप्ति तिथि और दूसरे की आरंभ तिथि के बीच के दिनों, जो "सामान्य" मामलों के लिए ठीक काम करता है, यानी जहां रोजगार की अवधि ओवरलैप नहीं होती है। खैर कि विशेष मामला सामने आया है, जहां किसी विशेष समय अवधि के दौरान किसी एक से अधिक नौकरी होती है, और जॉब ए की समय अवधि उस कर्मचारी के बीच होती है जब कर्मचारी के पास जॉब बी था। ऊपर दिए गए प्रश्न के साथ परीक्षण डेटा यहां दिया गया है:
DECLARE @EmploymentGapInfo TABLE
(
RowNum INT IDENTITY(1, 1)
,DriverQualificationApplicationEmploymentId INT
,DriverQualificationApplicationId INT
,StartDate DATETIME
,EndDate DATETIME
);
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '10/14/2003', '11/07/2003';
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '08/28/2006', '06/15/2011';
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '08/22/2011', '10/23/2012';
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '06/01/2012', '07/01/2012';
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '11/01/2012', '03/05/2013';
INSERT INTO @EmploymentGapInfo
SELECT -1, 766, '10/14/2013', NULL;
आप क्वेरी चलाते हैं, तो इसे गलत तरीके से 2012/07/01 और 2012/11/01 के बीच एक रोजगार की खाई है, जो कि रिकार्ड के लिए प्रारंभ दिनांक और समाप्ति तिथि के रूप में सही नहीं है की गणना के पिछले रिकॉर्ड के बीच शुरू होता है । क्वेरी अंतराल के लिए निम्नलिखित परिणाम सेट का उत्पादन करना चाहिए:
11/07/2003 -> 08/28/2006
06/15/2011 -> 08/22/2011
03/05/2013 -> 10/14/2013
मेरी समस्या यह है कि, मैं कर्सर के बिना इसे सही तरीके से गणना करने के लिए एक तरीके से आने की कोशिश कर रहा हूं, जिस तरह से मैं कोशिश कर रहा हूं, मुझे प्रत्येक के माध्यम से लूपिंग करना होगा EmploymentGapInfo तालिका चर में रिकॉर्ड करें, और एक बार मेरे पास उस रिकॉर्ड के लिए प्रारंभ और समाप्ति तिथियां हों, फिर तालिका के माध्यम से लूप को यह देखने के लिए कि प्रारंभ तिथि और समाप्ति तिथि तालिका में किसी अन्य रिकॉर्ड को ओवरलैप करती है या नहीं।
क्या कोई तरीका है कि मैं इस समस्या को कर्सर का उपयोग करने की बजाय सेट-आधारित दृष्टिकोण से निपट सकता हूं? क्या यह एक समस्या होगी जो डेटाबेस परत में इसे हल करने की कोशिश कर रहे व्यवसाय परत में किए जाने से लाभान्वित होगी?
किसी भी मदद की सराहना की जाएगी।
कोशिश: // sqlfiddle।कॉम /) डेमो और यहां लिंक दें – th1rdey3
अंतिम अंतर ('03/05/2013 -> 10/14/2013') गलत है क्योंकि यह पंक्ति' 10/14/2012 -> नल' है। –
@ th1rdey3: यहां SQL Fiddle का लिंक है: http://sqlfiddle.com/#!3/06753/3/0 – rc6886