2011-09-11 11 views
9

मेरे पास एक सारणी है जहां प्रत्येक पंक्ति को उस समय के निशान को चिह्नित करने की आवश्यकता होती है जब उसे डाला जाता है। मेरे पास बहुत सारे डेटाबेस अनुभव नहीं हैं, लेकिन कुछ मुझे बताता है कि यह डेटाबेस की तरफ स्वचालित रूप से संभाला जाएगा, उदाहरण के लिए संग्रहीत प्रक्रिया के माध्यम से।मैं SQL सर्वर में टाइमस्टैम्प कैसे संग्रहीत/पुनर्प्राप्त कर सकता हूं?

एमएस एसक्यूएल में टाइमस्टैम्प डेटाटाइप है, लेकिन इसके बारे में पढ़ना, इसे संख्याओं की श्रृंखला के रूप में माना जाता है, न कि सी # में डेटटाइम ऑब्जेक्ट के रूप में। तो अगर मैं रूपांतरण करना चाहता हूं तो क्या यह सिर्फ एक एनवीएआरएआरएआर डेटाटाइप नहीं हो सकता है?

तो बस डालें, एक टेबल पर डालने पर एक टाइमस्टैम्प को स्वचालित रूप से (स्वचालित रूप से?) डालने का सबसे आसान तरीका क्या है?

संपादित करें: तालिका परिभाषा बहुत सरल है। इस समय केवल दो कॉलम हैं और अभी भी टाइमस्टैम्प कॉलम की कमी है।

 SqlCommand command = con.CreateCommand(); 
     command.CommandText = "INSERT INTO Bio VALUES (" + 
      "@ID, @Name)"; 

     command.Parameters.AddWithValue("ID",number); 
     command.Parameters.AddWithValue("Name", name); 

     try 
     { 
      SqlDataReader thisReader = command.ExecuteReader(); 
      thisReader.Close(); 
     } 
     catch { // Do something }; 

समाधान ठीक है, यह अब काम करता है। मैंने पहली बार विजुअल स्टूडियो 2008 में सर्वर एक्सप्लोरर विंडो के माध्यम से नया कॉलम जोड़ने का प्रयास किया। मेरा डेटाबेस ढूँढना, राइट क्लिक करें और "नई क्वेरी" का चयन करें। तब

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

की तरह कुछ टाइपिंग लेकिन मैं संदेश है कि

ALTER टेबल एसक्यूएल निर्माण समर्थित नहीं है क्वेरी आरेख और मानदंड फलक में रेखांकन नहीं दर्शाया जा सकता मिल गया।

तो इसके बजाय मैंने इसे ग्राफिक रूप से जोड़ा। पहले "ओपन टेबल परिभाषा" और डेटा प्रकार के तहत कॉलम नाम और डेटाटाइम के तहत निर्मितडेट जोड़ना। अनुमति नल की जांच को हटा रहा है। फिर कॉलम प्रॉपर्टीज में मैंने

getutcdate() 

"डिफ़ॉल्ट मान या बाध्यकारी" नामक पंक्ति में सामान्य अनुभाग के तहत जोड़ा गया। जब भी कोई नई पंक्ति डाली जाती है, तो डेटाबेस स्वचालित रूप से वर्तमान दिनांक और समय को टाइमस्टैम्प के रूप में देता है।

उत्तर

8

एक तालिका में एक CreatedDate स्तंभ इस तरह इसे बनाने के लिए:

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

संपादित करें: आप करने के लिए) मूल्य कि रिकॉर्ड आप GetUtcDate (पुन: असाइन कर सकते हैं के हर अद्यतन पर अद्यतन करना चाहते हैं अगर बाद में वह कॉलम या किसी अन्य व्यक्ति (जिसे मैंने इसे निर्मित किया है, को अद्यतन में उपयोग नहीं किया जाना चाहिए, लेकिन आप या तो एक और जोड़ सकते हैं या संशोधित संशोधित)। मैं निश्चित रूप से संग्रहित प्रक्रिया में ऐसे कॉलम का अद्यतन शामिल करूंगा जो UPDATE करता है, यहां ट्रिगर्स की कोई आवश्यकता नहीं है।

+0

मैंने इस कमांड लाइन का उपयोग करने की कोशिश की, लेकिन ग्राफिकल संपादक को आसान पाया। मैंने जो किया वह मूल प्रश्न के नीचे जोड़ा गया है। सहायता के लिए धनयवाद। –

+1

मुझे पता है कि यह वास्तव में एक पुराना सवाल है, लेकिन शानदार जवाब! – Tom

1

आप पंक्ति में समय टिकट डालने के लिए CURRENT_TIMESTAMP या FN NOW() का उपयोग कर सकते हैं।

6

SQL सर्वर "टाइमस्टैम्प" प्रकार मानक "टाइमस्टैम्प" जैसा नहीं है: यह अधिक सही "पंक्तिवर्ती" है। डेटाटाइप "टाइमस्टैम्प" को बहिष्कृत किया जा रहा है।See MSDN for all of this

आप datetime which is a real date/time value

का उपयोग करना चाहिए सबसे आसान तरीका है, जिससे कि एसक्यूएल सर्वर यह स्वचालित रूप से कहना है

संपादित करें मेज पर GETDATE या GETUTCDATE साथ स्तंभ पर एक डिफ़ॉल्ट के लिए: अद्यतन

के लिए आप अद्यतन के लिए इस वाक्य रचना का उपयोग कर सकते

UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ... 

इसका कारण यह है DEFA उपयोगी है अल्ट्रा बाधा मूल्य को निर्धारित नहीं करता है। इसलिए यदि आप डिफ़ॉल्ट बदलते हैं (कहते हैं कि आप GETUTATE से GETUTCDATE पर स्विच करते हैं) तो आप कोड

+0

धन्यवाद। यह बहुत प्रबुद्ध था। –

1

ट्रिगर बनाना एक तरीका है, हालांकि शायद एसक्यूएल पक्ष पर इसे संभालने के लिए सबसे अच्छा तरीका नहीं है, यह भी जब एक पंक्ति अद्यतन किया जाता है टाइमस्टैम्प अपडेट करना चाहते हैं:

CREATE TRIGGER MyTimestampTrigger ON tblMyTable FOR INSERT,UPDATE AS 
UPDATE tblMyTable SET fldTimestamp=getdate() WHERE fldId IN (SELECT fldId FROM INSERTED) 
GO 

(यदि fldId प्राथमिक कुंजी है, fldTimestamp टाइमस्टैम्प क्षेत्र है और tblMyTable तालिका का नाम)।

डेटाटाइम कॉलम पर डिफ़ॉल्ट मान वाले अन्य उत्तरों शायद आपकी सबसे अच्छी पसंद है।

+0

अपडेट के लिए आप डिफॉल्ट कीवर्ड 'अपडेट टी सेट कॉल = @x, अपडेटेडडेट टाइम = डेफॉल्ट कहां उपयोग कर सकते हैं ...' ट्रिगर – gbn

+1

की बजाय मैं वास्तव में नहीं जानता था। यह वास्तव में एक बेहतर समाधान है। – DeCaf

+0

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

संबंधित मुद्दे