SQL सर्वर में डेटाटाइम फ़ील्ड का डिफ़ॉल्ट मान टाइमस्टैम्प में जोड़ें


265

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

मुझे पता है कि यह कहीं न कहीं है, लेकिन मुझे यह पता नहीं लग सकता है कि डिफ़ॉल्ट मान कैसे सेट करें (जैसे एक्सेस, आप उपयोग करते हैं getNow()या Now()) लेकिन मुझे नहीं पता कि इसे कहां रखा जाए।


टाइमज़ोन से सावधान रहें: stackoverflow.com/a/31296917/57475
टैनर

जवाबों:


332

किसी मौजूदा तालिका में मौजूदा कॉलम को संशोधित करने के लिए:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

2
@ क्यू - धन्यवाद। मुझे लगता है कि मैं "YourTable" को अपनी तालिका के नाम में बदल देता हूं, लेकिन जो हिस्सा मुझे समझ में नहीं आता वह बाधा है। एक बाधा क्या है और क्या मैं आपके कोड को मेरी तालिका के नाम से मिलान करने के लिए संशोधित करूंगा?
स्टेपहोमलैंड

@steph - TheQका उत्तर मान लिया गया है कि आप एक मौजूदा कॉलम को बदल रहे हैं, जिस पर मुझे विश्वास नहीं है? इस डिफ़ॉल्ट बाधा के साथ एक नया कॉलम जोड़ने के लिए कोड के लिए मेरा उत्तर देखें।
मार्टिन स्मिथ

1
डिफ़ॉल्ट मान रखने के लिए किसी स्तंभ के लिए, उसे "डिफ़ॉल्ट बाधा" की आवश्यकता होती है, और यह आदेश उसे जोड़ देगा। आप अपनी पसंद के अनुसार जो भी नाम चाहें, प्रबंधन स्टूडियो आमतौर पर उन्हें DF_TableName नाम दे सकते हैं।
TheQ

@ क्यू - यह बिल्कुल सही है, मैं इसे आज़माऊँगा। आप सही थे, मेरे पास पहले से ही मैदान है, लेकिन मैं इसे ठीक करना चाहता था, एक नया निर्माण नहीं करना चाहता था। आपके सभी उत्तरों के लिए धन्यवाद!
स्टेपहोमलैंड

6
यदि आप स्थानीय समय के बजाय UTC टाइमस्टैम्प चाहते हैं, तो आप GETUTCDATE()इसके स्थान पर उपयोग कर सकते हैंGETDATE()
Cocowalla

147

यह SSMS GUI के माध्यम से भी किया जा सकता है।

  1. अपनी तालिका को डिज़ाइन दृश्य में रखें (ऑब्जेक्ट एक्सप्लोरर में तालिका पर राइट क्लिक करें-> डिज़ाइन )
  2. तालिका में एक स्तंभ जोड़ें (या उस स्तंभ पर क्लिक करें जिसे आप अपडेट करना चाहते हैं यदि यह पहले से मौजूद है)
  3. स्तंभ गुण में, पाठ बॉक्स (getdate())में डिफ़ॉल्ट मान या बाध्यकारी क्षेत्र के रूप में नीचे दर्शाया गया

डिज़ाइन दृश्य में तालिका की छवि


अच्छा प्रश्न। मैं यह dateadd(minute, 10, GetDate())देखने की कोशिश करूंगा कि क्या यह काम करता है।
टोनी एल।

Sql सर्वर डिज़ाइन दृश्य में मैंने इसे आज़माया, यह कहता है कि मूल्य सूची में किसी एक आइटम से मेल खाना चाहिए! इसलिए मैंने इसे बैक एंड साइड पर बनाया
Shareef

92

SQL सर्वर में उस तालिका में, उस कॉलम का डिफ़ॉल्ट मान निर्दिष्ट करें CURRENT_TIMESTAMP। उस कॉलम का डेटाटाइप डेटाटाइम या डेटाटाइम 2 हो सकता है।

जैसे

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);

1
यह त्रुटि संदेश के साथ विफल रहता है "[B और TIMESTAMP] के बीच कनवर्ट करने में असमर्थ"। ऐसा लगता है कि CURRENT_TIMESTAMP एक बाइनरी वैल्यू है, न कि डेटाइम।
सिंदरी ट्रैस्टासन

TIMESTAMP आपको इस तरह से एक इनपुट देगा: yyyy-mm-dd 00:00:00 UTC; और जो DB को इतना बड़ा बना सकता है; मुझे लगता है कि वह केवल yyyy-mm-dd का मतलब था; और इसके लिए डिफ़ॉल्ट मान phpmyadmin के सामान्य दृश्य में "As Defined as" पर क्लिक करके सेट किया जा सकता है
Amine

@Amine, TIMESTAMP एक बाइनरी वैल्यू है, जो आमतौर पर 6-8 बाइट्स का उपयोग करता है। स्ट्रिंग प्रतिनिधित्व सिर्फ यह है कि, एक प्रतिनिधित्व, डेटाबेस की तरह तार के रूप में पूर्णांक जमा नहीं है। (जब तक आप समय को एक VARCHAR कॉलम में नहीं डालते हैं, और वे जो कोशिश करते हैं, वे हो सकते हैं।)
सिल्वरबैकनेट

1
मैं ध्यान CURRENT_TIMESTAMPदेता हूं कि datetimeकंप्यूटर के स्थानीय समय क्षेत्र में एक मान लौटाता है । इससे बचना चाहिए। इसके बजाय यूटीसी में SYSUTCDATETIMEरिटर्न का उपयोग करें datetime2
दाई

28

जबकि चिह्नित उत्तर के साथ सही है:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

कॉलम में डिफ़ॉल्ट डेटाइम मान जोड़ते समय आपको हमेशा टाइमज़ोन के बारे में पता होना चाहिए।

उदाहरण के लिए कहें, यह datetimeमान यह इंगित करने के लिए डिज़ाइन किया गया है कि जब कोई सदस्य किसी वेबसाइट से जुड़ता है और आप चाहते हैं कि वह उपयोगकर्ता को वापस दिखाई GETDATE()दे , तो आपको सर्वर का समय देगा ताकि उपयोगकर्ता सर्वर में भिन्न लोकेल में हो तो विसंगतियां दिखा सके।

यदि आप अंतरराष्ट्रीय उपयोगकर्ताओं से निपटने की उम्मीद करते हैं, तो कुछ मामलों में GETUTCDATE () का उपयोग करना बेहतर है , जो:

वर्तमान डेटाबेस प्रणाली टाइमस्टैम्प को डेटाइम मान के रूप में देता है। डेटाबेस समय क्षेत्र ऑफसेट शामिल नहीं है। यह मान वर्तमान UTC समय (समन्वित सार्वभौमिक समय) का प्रतिनिधित्व करता है। यह मान कंप्यूटर के ऑपरेटिंग सिस्टम से लिया गया है जिस पर SQL सर्वर का उदाहरण चल रहा है।

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETUTCDATE() FOR YourColumn

मूल्यों को प्राप्त करते समय, फ्रंट एंड एप्लिकेशन / वेबसाइट को यह मान यूटीसी समय से उस उपयोगकर्ता के स्थानीय / संस्कृति में बदलने का अनुरोध करना चाहिए।


19

स्तंभ पर Nulls को अस्वीकार करें और के कॉलम पर एक डिफ़ॉल्ट सेट करें getdate()

/*Deal with any existing NULLs*/
UPDATE YourTable SET created_date=GETDATE() /*Or some sentinel value 
                                                '19000101' maybe?*/
WHERE created_date IS NULL


/*Disallow NULLs*/
ALTER TABLE YourTable ALTER COLUMN created_date DATE NOT NULL

/*Add default constraint*/
ALTER TABLE YourTable ADD CONSTRAINT
    DF_YourTable_created_date DEFAULT GETDATE() FOR created_date

आप मौजूदा फ़ील्ड "create_date" को बदलने के लिए उसे कैसे बदलेंगे?
स्टेफमोरलैंड

@steph - संपादित देखें मेरा पिछला उत्तर माना जाता है कि यह एक नया कॉलम था। आपको काम करने के लिए डिफ़ॉल्ट के लिए NULLs को अस्वीकार करना होगा ताकि आप पहले से मौजूद पंक्तियों को कैसे व्यवहार करना चाहते हैं?
मार्टिन स्मिथ

8

नई तालिका बनाते समय इसके लिए वाक्य रचना है:

CREATE TABLE MyTable
(
    MYTableID INT IDENTITY(1,1),

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

यह एक नया कॉलम जोड़ते समय समान सारणी में समान रूप से अच्छी तरह से काम करता है।
कैप्टन सेंसिबल

7

यह मेरे लिए काम करता है ...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;


4

इसने मेरे लिए काम किया। मैं Oracle DB के साथ SQL डेवलपर का उपयोग कर रहा हूं:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

इसे सरल बनाने के लिए, मैं उपरोक्त उत्तरों को संक्षेप में प्रस्तुत करूंगा :

Let`s का कहना है कि तालिका को ग्राहक कहा जाता है इसमें 4 कॉलम / कम या अधिक है ...

आप उस तालिका में एक नया स्तंभ जोड़ना चाहते हैं, जहां हर बार जब डाला जाता है ... तब वह स्तंभ उस समय का रिकॉर्ड रखता है, जब ईवेंट हुआ था।

उपाय:

कोई नया स्तंभ जोड़ने, `s का कहना है timepurchase नया स्तंभ, डेटा प्रकार के साथ मेज पर है datetime

फिर निम्न परिवर्तन चलाएँ:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase

1

मान लीजिए कि आप एक पंजीकरण प्रणाली के लिए एक डेटाबेस तालिका बनाते हैं।

IF OBJECT_ID('dbo.registration_demo', 'U') IS NOT NULL 
  DROP TABLE dbo.registration_demo; 

CREATE TABLE dbo.registration_demo (
    id INT IDENTITY PRIMARY KEY,
    name NVARCHAR(8)
);

अब एक दो लोग रजिस्टर करते हैं।

INSERT INTO dbo.registration_demo (name) VALUES
    ('John'),('Jane'),('Jeff');

तब आपको पता चलता है कि आपको पंजीकृत होने के लिए टाइमस्टैम्प की आवश्यकता है।

यदि यह ऐप भौगोलिक रूप से स्थानीयकृत क्षेत्र तक सीमित है, तो आप स्थानीय सर्वर समय का उपयोग कर सकते हैं GETDATE()। अन्यथा आपको डिफ़ॉल्ट मूल्य के लिए वैश्विक दर्शकों के लिए टान्नर के विचार पर ध्यान देना चाहिए GETUTCDATE()

इस उत्तर की तरह एक कथन में डिफ़ॉल्ट मान के साथ कॉलम जोड़ें ।

ALTER TABLE dbo.registration_demo
ADD time_registered DATETIME DEFAULT GETUTCDATE();

आइए एक और रजिस्ट्रार प्राप्त करें और देखें कि डेटा कैसा दिखता है।

INSERT INTO dbo.registration_demo (name) VALUES
    ('Julia');

SELECT * FROM dbo.registration_demo;
id    name    time_registered
1     John    NULL
2     Jane    NULL
3     Jeff    NULL
4     Julia   2016-06-21 14:32:57.767

0

SQLPlus में तालिका बनाते समय यह इस प्रकार है

SQL> तालिका परीक्षण बनाएँ

 ( Test_ID number not null,
   Test_Date date default sysdate not null );

एसक्यूएल> टेस्ट (आईडी) मान (1) में डालें;

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