हाल ही में एक परियोजना में एक आवश्यकता को रिपोर्ट करने के लिए किया गया था जब एक संसाधन पूरी तरह से भस्म हो जाएगा। साथ ही थकावट की कैलेंडर तिथि को मुझे शेष समय अंग्रेजी जैसे प्रारूप में दिखाने के लिए कहा गया, जैसे "1 वर्ष, जाने के लिए 3 महीने।"
बिल्ट-इन DATEDIFF
फ़ंक्शन
निर्दिष्ट प्रारंभ और समाप्ति के बीच पार की गई निर्दिष्ट दिनांक सीमा की ... की गिनती देता है।
यदि इसका उपयोग किया जाता है, तो यह भ्रामक या भ्रामक परिणाम उत्पन्न कर सकता है। उदाहरण के लिए, YEAR के अंतराल का उपयोग करते हुए 1999-12-31 (YYYY-MM-DD) और 2000-01-01 को एक वर्ष के लिए अलग दिखाया जाएगा, जबकि सामान्य ज्ञान का कहना है कि ये तिथियां केवल 1 दिन द्वारा अलग हो जाती हैं। इसके विपरीत DAY 1999-12-31 और 2010-12-31 के अंतराल का उपयोग करते हुए 4,018 दिन अलग हो जाते हैं जबकि अधिकांश लोग "11 वर्ष" को बेहतर विवरण के रूप में देखते हैं।
दिनों की संख्या से शुरू करने और वहाँ से महीनों और वर्षों की गणना करने से लीप वर्ष और आकार-महीने की त्रुटियों का खतरा होगा।
मैं सोच रहा था कि इसे विभिन्न SQL बोलियों में कैसे लागू किया जा सकता है? उदाहरण आउटपुट में शामिल हैं:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', '1 month, 1 day'), -- leap years to be accounted for
('2000-01-01', '2000-12-31', '11 months, 30 days'),
('2000-02-28', '2000-03-01', '2 days'),
('2001-02-28', '2001-03-01', '1 day'), -- not a leap year
('2000-01-01', '2001-01-01', '1 year'),
('2000-01-01', '2011-01-01', '11 years'),
('9999-12-30', '9999-12-31', '1 day'), -- catch overflow in date calculations
('1900-01-01', '9999-12-31', '8099 years 11 months 30 days'); -- min(date) to max(date)
मैं SQL Server 2008R2 का उपयोग कर रहा हूं, लेकिन मुझे यह जानने में दिलचस्पी है कि अन्य बोलियां इसे कैसे संभालेंगी।