एसक्यूएल जहां दिनांक अंतराल के साथ खंड - कौन सा तरीका सबसे अच्छा है?
संदर्भ
डेटा प्रोटेक्शन एक्ट के कारण, कुछ डेटा को सिस्टम से निर्धारित समय पर हटा दिया जाना चाहिए, ज्यादातर मामलों में यह सात साल का होता है।
जब एक क्लाइंट साइट पर इसकी जांच की गई, तो हमें भेजे गए प्रश्न की जांच करने पर उन्हें अजीब परिणाम मिल रहे थे।
SQL
SELECT *FROM AccountsWHERE DATEDIFF(YEAR,ClosedDate,GETDATE())>=7
एक परीक्षण तालिका बनाएं
अब यह सही मात्रा की तरह दिखता है, हालांकि आगे के निरीक्षण पर सात साल पहले की स्थिर तारीख की तुलना में अधिक खाते थे, तो उसने ऐसा क्यों किया?
मैंने इसकी जांच के लिए निम्नलिखित कोड बनाया है।
SQL
DECLARE @Records TABLE (RecordID INT,RecordClosed DATETIME)DECLARE @InsRecID INT = 1DECLARE @InsRecDate DATE=DATEADD(YEAR,-8,GETDATE())WHILE @InsRecDate INSERT INTO @Records SELECT @InsRecID,@InsRecDate SET @InsRecID = @InsRecID+1 SET @InsRecDate=DATEADD(DAY,1,@InsRecDate)ENDDECLARE @DateFrom DATE=DATEADD(YEAR,-7,GETDATE())SELECT MAX(RecordClosed) FROM @RecordsSELECT MAX(RecordClosed) FROM @Records WHERE DATEDIFF(YEAR,RecordClosed,getdate())>=7SELECT MAX(RecordClosed) FROM @Records WHERE RecordClosed<@DateFromSELECT MAX(RecordClosed) FROM @Records WHERE RecordClosed<=@DateFromSELECT MAX(RecordClosed) FROM @Records WHERE DATEDIFF(DAY,RecordClosed,getdate())/365.25>7
परिक्षण
Results
2007-03-21 00:00:00.000
2006-12-31 00:00:00.000
2006-03-20 00:00:00.000
2006-03-21 00:00:00.000
2006-03-21 00:00:00.000
क्या सही है?
पहला रिकॉर्ड अस्थायी तालिका में सबसे बड़ी तारीख है, इसलिए यह ठीक है।
दूसरे रिकॉर्ड ने 2006 के अंत तक सभी खातों को उठा लिया है, यह एक संभावित मुद्दा हो सकता था क्योंकि बहुत अधिक डेटा हटा दिया गया होता। वर्ष पर DATEDIFF विशुद्ध रूप से वर्ष 7 साल पहले की जाँच कर रहा है।
तीसरा और चौथा रिकॉर्ड वह है जो हम चाहते हैं, इस पर निर्भर करता है कि आप सात साल पहले के दिन को अंदर या बाहर के रूप में शामिल करना चाहते हैं।पांचवां रिकॉर्ड, हालांकि रन करते समय सही है, लीप वर्ष की गणना का उपयोग कर रहा है, और यदि आपको विशिष्ट होना है तो सटीकता के लिए भरोसा नहीं किया जा सकता है।
Speed difference
While checking the records, I ran it on the system checking 2,500,000 records for 3 and 5 above.
Statement 5 returned our result in 6 seconds, Statement 3 in only 3 seconds, so not only were we now sure that we were accurate, but we were also processing the records quicker.
Try to use a proper date when querying dates, hope this helps someone scratching their head.