2009-02-04 9 views
10

में पुरानी तिथियों को संग्रहीत करने का सबसे अच्छा तरीका SQL सर्वर 2005 में पुराने दिनांक (प्री-1753) को संग्रहीत करने का सबसे अच्छा/सबसे प्रभावी तरीका क्या है? मैं समय संग्रह करने से चिंतित नहीं हूं - बस तिथियां। SQL सर्वर का डेटाटाइम डेटा प्रकार केवल 1 जनवरी, 1753 को तारीखों को पकड़ सकता है। एमएसडीएन दस्तावेज़ बताता है कि दिनांक और डेटाटाइम 2 डेटा प्रकार हैं, लेकिन SQL सर्वर प्रबंधन स्टूडियो उन्हें समर्थन नहीं दे रहा है (त्रुटि: अमान्य डेटा प्रकार)।SQL सर्वर

"YYYYMMDD" फ़ॉर्म के स्ट्रिंग या इनट्स के रूप में तारीखों को स्टोर करने में कितना अक्षम होगा? मैं अपनी तालिका (स्टार्टडेट और एंडडेट) में दो दिनांक फ़ील्ड पर बहुत सी क्वेरीिंग और सॉर्टिंग करता हूं।

अद्यतन:

अलग क्षेत्रों में दुकान वर्ष, माह, और आज तक नीचे कुछ सुझाव किया गया है। एक पूर्णांक क्षेत्र के बजाय अलग-अलग क्षेत्रों में भागों को संग्रहीत करने का क्या फायदा है?

+0

की जांच करने के लिए कुछ हो सकता है 1 के बजाय 3 पूर्णांक का उपयोग करने का लाभ यह है कि आपको कोडमोनकी 1 द्वारा प्रस्तावित दिनों की गणना करने की आवश्यकता नहीं है । यह लगता है की तुलना में यह अधिक कठिन है। – Treb

+0

तिथियां क्या संबंधित हैं? आप [ग्रेगोरियन बनाम जूलियन कैलेंडर मुद्दों पर विचार करने की आवश्यकता हो सकती है] (http://stackoverflow.com/questions/3310569/what-is-the-ignignance-of-1-1-1753-in-sql-server/3310588#3310588) –

उत्तर

15

date प्रकार निश्चित रूप से आप उपयोग करना चाहते हैं। यह रेंज "जनवरी 1, 1 एडी 31 दिसंबर, 99 99 एडी के माध्यम से है" यह समय के बिना, तारीख की जानकारी भी संग्रहीत करता है।

क्या आप शायद 2008 के बजाय एसएसएमएस 2005 का उपयोग कर रहे हैं, या 2005 के उदाहरण से जुड़े हुए हैं? उस प्रकार introduced in SQL Server 2008 था। यदि आपके पास 2008 डेटाबेस का उपयोग करने की क्षमता है, तो मुझे लगता है कि यह निर्विवाद रूप से जाने का तरीका है।

+0

अपग्रेड करने के कारण की तरह लगता है! – inspite

4

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

यह चयन और सॉर्टिंग के मामले में काफी कुशल होना चाहिए।

4

स्ट्रिंग शायद वर्ष, महीने और दिन के लिए पूर्णांक संग्रह करने से कम कुशल होंगे। यह आपके प्रश्नों में थोड़ा और शब्द है, लेकिन वे शायद तेज़ी से दौड़ेंगे क्योंकि आप उन्हें उन तरीकों से अनुक्रमित कर सकते हैं जो आपके द्वारा किए जा रहे प्रश्नों के बारे में समझ में आते हैं।

उदाहरण के लिए

तो:

CREATE TABLE myOldDates (
    year INT, 
    month INT, 
    day INT, 
    -- otherstuff ... 
) 

फिर प्रश्नों सब होगा जैसे:

-- get records between 5/15/1752 and 3/19/1754 
SELECT * FROM myOldDates 
    WHERE 
    (year = 1752 AND ((month = 5 and day >= 15) or month > 5) OR year > 1752) 
    AND (year = 1754 AND ((month = 3 and day <= 19) or month < 3) OR year < 1754) 

कि बदसूरत, सुनिश्चित करने के लिए है, लेकिन उस के रूप में यह सीमा प्रश्नों के लिए हो जाता है के बारे में के रूप में बदसूरत है, तो एक बार जब आप इसे पहली बार लिखते हैं, तो आप इसे एक फ़ंक्शन में encapsulate कर सकते हैं।

1

YYYYMMDD प्रारूप में तारीखों को संग्रहीत करने में एक समस्या यह है कि आप उन तिथियों के साथ समाप्त हो सकते हैं जो मौजूद नहीं हैं (उदाहरण के लिए 16000231 - फरवरी 31 मौजूद नहीं है)। डीबी में प्रवेश करने से पहले आपको कुछ सत्यापन क्लाइंट पक्ष करना होगा।

Ian Varley द्वारा प्रस्तावित वर्ष, महीने और दिन पूर्णांक में तारीख को संग्रहीत करने के लिए यह सही है। लेकिन उस से मुझे लगता है कि मुझे उसका जवाब पसंद है और बस इच्छा है कि मैंने इसके बारे में सोचा होगा ;-)

+0

किसी भी बाहरी स्रोत से प्राप्त डेटा के लिए प्रत्येक उचित ग्राहक क्या करता है? :) (संकेत: इसे मान्य करता है) – Esko

+0

यूप। विहट तिथियों से निपटने के दौरान इसकी केवल कुछ चीज को अनदेखा किया जा सकता है, क्योंकि बिल्टिन डेट प्रकार आपके लिए सत्यापन करते हैं। – Treb

1

YYYYMMDD = 8 बाइट्स। आप इसे 3 कॉलम का उपयोग करके SMALLINT और TINYINT के साथ 4 बाइट तक काट सकते हैं।

1

कोडमोनकी 1 द्वारा सुझाए गए इन्ट्स का उपयोग करना एक अच्छा विचार प्रतीत होता है, और "डेट गणित" (उदाहरण के लिए, कुछ दिनांक + XX दिन) करना आसान हो जाएगा।> YYYYMMDD - -

कुछ UDFs (CodeMonkey1 द्वारा के रूप में भी सलाह दी) पूर्णांक कन्वर्ट करने के लिए लिखें> पूर्णांक और आप लचीलापन है कि इयान वर्ली उसके जवाब में उल्लेख करना होगा।

1

एक विचार - यदि आपके पास कुछ .NET ज्ञान है तो आप तिथि को स्टोर करने के लिए एक सीएलआर प्रकार बना सकते हैं, जो अनिवार्य रूप से एक डेटाटाइम होगा। यदि आप सरल प्रश्नों की बजाय तिथि के साथ बहुत सी गणना कर रहे हैं, तो यह