पूर्णांक (संख्यात्मक) के रूप में दिनांक जमा करना, क्या फायदे हैं


11

प्रश्न 1

मैं एक ऐसी प्रणाली के साथ काम कर रहा हूँ, जहाँ दिनांक पूर्णांक (वास्तविक संख्या (8,0)) के रूप में संग्रहीत की जाती है और मैंने देखा है कि अन्य प्रणालियाँ भी तारीख को इस धागे में सिस्को जैसे स्टोर करती हैं । उदाहरण

20120101  -- 01 Jan 2012

क्या संख्यात्मक तिथि प्रणाली रखने और SQL डेटाइम का उपयोग नहीं करने का कोई फायदा है?

प्रश्न 2

अब मैं दो तिथियों के बीच ग्राहकों को खोजने के लिए संख्यात्मक तारीख के माध्यम से लूप करने की कोशिश कर रहा हूं। तो startऔर enddateधरना दो महीने, मैं सिर्फ 60. उदाहरण के बजाय रिकॉर्ड के हजारों मिलती है:

create table #temp1(day int,capacity int) /* just a temp table */

declare @start int 
declare @end int

set @start=20111201
set @end = 20120131

while (@start <= @end) 
Begin
    insert into #temp1  /* I am storing things in #temp table so data looks pretty */
    exec usp_GetDailyCap @date1= @start

    set @start = @start + 1;    
end

select * from #temp1

यह 60 के बजाय 8931 रिकॉर्ड को खींचता है। क्या तर्क को बेहतर बनाने का एक बेहतर तरीका है इसलिए मैं केवल वैध तिथियां खींचता हूं? मैंने अलग-अलग और उप-प्रश्नों की कोशिश की, लेकिन एक कुशल तरीके से काम नहीं किया।


यदि आप SQL Server 2008 या उच्चतर चला रहे हैं, तो आप वास्तव में डेटा प्रकार दिनांक का उपयोग कर सकते हैं। यह थोड़ा छोटा है और आपको इसमें शामिल होने के लिए मजबूर नहीं करता है, लेकिन SQL के लगभग सभी कार्य अभी भी इसके लिए काम करते हैं।
DForck42

2
मैं केवल इस दृष्टिकोण में नुकसान देखता हूँ, जो भी हो
a_horse_with_no_name

जवाबों:


11

आपके पहले प्रश्न का उत्तर देने के लिए, मैं DATETIMESQL सर्वर के भीतर डेटा प्रकार का उपयोग करने की सलाह दूंगा । जरूरी नहीं कि प्रदर्शन कारणों के लिए, लेकिन RDBMS- विशिष्ट कार्यक्षमता का लाभ उठाने के लिए। उदाहरण के लिए, आप तर्क का एक बहुत फिर से आविष्कार करने के लिए सिर्फ बुनियादी तारीख गणित करना होगा (लगता है DATEDIFF(), DATEADD(), DATEPART()और कई अन्य कार्य करता है। वे स्पष्ट रूप से के अनुरूप हैं DATETIMEडेटा प्रकार और साथ काम करने के लिए आसान कर रहे हैं)।

अपने दूसरे प्रश्न के रूप में, आप उस सटीक समस्या में चल रहे हैं जिसका पहला प्रश्न (और मेरा उत्तर) हैआप 20111201 और 20120131 को तारीखों के रूप में देख रहे हैं, और आपका मस्तिष्क आपको बता रहा है कि 60 दिनों का अंतर होना चाहिए। ठीक है, आप डेल्टा से दूर के माध्यम से पाशन कर रहे हैं ... जो है:

20120131 - 20111201 = 8930 (समावेशी लूप के साथ यह 8931 होगा)

दूसरे शब्दों में, आपका WHILEलूप 8931 बार निष्पादित हो रहा है। ऐसा इसलिए हो रहा है क्योंकि वे पूर्णांक मान हैं और आपका लूप 20111231 से सीधे 20120101 तक नहीं जाएगा।

आप पूर्णांक वर्षों और महीनों (यानी आपके प्रश्न 2 समस्या) की टोपी को ध्यान में नहीं रखते हैं ।


खैर यह मेरा सवाल है। संख्यात्मक तारीखों के लिए, लूप हजारों में जा सकते हैं, न कि केवल 30 दिनों या 29 दिनों में। लेकिन ध्यान रखें कि मैं एक पेशेवर प्रणाली के साथ काम कर रहा हूं । और यहां तक ​​कि सिस्को भी इसका उपयोग करता है जैसा कि लगता है।
जैकोफॉल

4
प्रदर्शन और कार्यक्षमता के अलावा, अखंडता भी है। दिनांक के रूप में पूर्णांक के साथ, db अनुमति देगा 20121301और 20120230और 20129999दिनांक के रूप में भी ।
ypercube y

@ जैकोफॉल सिस्को के पास इसके पीछे आरडीबीएमएस का मंच नहीं है। उन्होंने अपना तर्क लिखा। वे सिर्फ पूर्णांक का उपयोग क्यों नहीं करेंगे । जमीन से ऊपर, कि शायद कम स्तर के सॉफ्टवेयर के लिए सबसे आसान तरीका है। लेकिन हम यहां सेब और संतरे की बात कर रहे हैं।
थॉमस स्ट्रिंगर

3
@ जैकोफ़ॉल: पूर्णांक (और अंतराल) होने और डेटेटाइम / टाइमस्टैम्प को पूर्णांक के रूप में संग्रहीत करने के बीच बहुत अंतर है - या पूर्णांक के रूप में दिनांक भी, जैसे वीबी / एक्सेल करता है।
ypercube y

4
कई (यदि अधिकांश नहीं) पेशेवर रूप से डिज़ाइन किए गए डेटाबेस हैं जो खराब तकनीकों का उपयोग करते हैं। मैंने कई COTS उत्पादों के साथ काम किया है और ऐसा कोई भी नहीं देखा है जो डेटाबेस के नजरिए से अच्छी तरह से ख़राब था।
HLGEM

6
  1. राल्फ किमबॉल पूर्णांक के रूप में भंडारण की तारीखों की सिफारिश करता है। उन्होंने बहुत कुछ लिखा है, दोनों ऑनलाइन लेख और किताबें।
  2. आप एक कैलेंडर तालिका का उपयोग कर सकते हैं और अपनी तिथियों के लिए लगातार नंबर जारी कर सकते हैं, इस प्रकार है:

    दिनांक संख्या

    20120229 1234

    20120301 1235

कैलेंडर तालिका जेनरेट करनी होती है, लेकिन यह बहुत आसान काम है।


1
मैं उस मामले को देखना चाहता हूं, जहां आप किसी तिथि को संख्यात्मक के रूप में संग्रहीत तिथियों के साथ जोड़कर एक क्वेरी को फ़िल्टर करते हैं और उन संख्यात्मक तिथियों को फ़िल्टर करते हुए "जहां [तिथि] का उपयोग @startdate और @enddate" के बीच होता है
DForck42

1
@ DForck42 उस मामले की कोई आवश्यकता नहीं है जो आप सुझा रहे हैं: "जहां [डेटएयंट] 20120229 और 20120329 के बीच" ठीक उसी पंक्तियों के रूप में वापस आएगा "जहां" तारीख ['20209 'और' 20120329 'के बीच "
AK

3
और उसका तर्क क्या था?
HLGEM

5

संभावित डेटा प्रकार और उनके आकार / सीमाएँ:

  • दशमलव (8,0): 5 बाइट्स
  • दिनांक: 3 बाइट्स, 0001-01-01 9999-12-31 के माध्यम से
  • इंट: 4 बाइट्स

संख्यात्मक डेटा प्रकार के लिए नियम:

  • वे सुंदर लग रही हो?

संख्यात्मक डेटा प्रकार के लिए विपक्ष:

  • तिथि संचालन से निपटने के लिए कस्टम कोड की आवश्यकता होती है
  • सही तिथियों के प्रबंधन के लिए कस्टम कोड की आवश्यकता है (अर्थात, 20120230 [30 फरवरी, 2012] की अनुमति नहीं)
  • दिनांक डेटा प्रकार की तुलना में बड़ा डेटा फ़ुटप्रिंट।

ईमानदारी से, आप डेट डेटा प्रकार IMHO का उपयोग करके बेहतर हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.