2009-03-05 16 views
19

ट्रांजैक्ट एसक्यूएल का उपयोग करना कॉलम पर एक डिफ़ॉल्ट डेटाटाइम निर्दिष्ट करने का एक तरीका है (तालिका तालिका विवरण में) जैसे डेटाटाइम डेटाटाइम मानों के लिए न्यूनतम संभव मूल्य है?टीएसक्यूएल डिफ़ॉल्ट न्यूनतम दिनांक समय

 
create table atable 
(
    atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
    Modified datetime DEFAULT XXXXX?????? 
) 

शायद मुझे इसे शून्य छोड़ देना चाहिए।

उत्तर

36

जहां तक ​​मुझे पता है कि इसे वापस करने के लिए कोई फ़ंक्शन मौजूद नहीं है, आपको इसे कठिन सेट करना होगा।

न्यूनतम तिथि प्राप्त करने के लिए 0 जैसे मानों से कास्ट करने का प्रयास 01-01-19 00 को डिफ़ॉल्ट होगा।

जैसा कि पहले सुझाव दिया गया था कि पहले सबसे अच्छा बाएं सेट न्यूल (और यदि आपको आवश्यकता हो तो पढ़ने के लिए ISNULL का उपयोग करें), या यदि आप इसे सही तरीके से सेट करने के बारे में चिंतित हैं तो आप संपादन पर अपनी संशोधित तिथि सेट करने के लिए तालिका पर एक ट्रिगर भी सेट कर सकते हैं।

आप अपने दिल न्यूनतम संभव तारीख तो हो रही पर सेट किया है, तो:

 
create table atable 
(
    atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
    Modified datetime DEFAULT '1753-01-01' 
) 

11

"शायद मैं यह शून्य छोड़ देना चाहिए"

जादू नंबरों का उपयोग न करें - यह बुरा व्यवहार है - अगर आप एक मूल्य की जरूरत नहीं है छोड़ यह शून्य

अन्यथा यदि आप वास्तव में एक डिफ़ॉल्ट दिनांक चाहते - अन्य तकनीकों एक डिफ़ॉल्ट दिनांक

+3

मैं मानता हूँ के लिए करते हैं जाएगा। एक तरफ के रूप में, क्या आपके पास इस सवाल का जवाब है? – user72491

+4

मुझे नफरत है जब उपयोगकर्ता उत्तर देने के बजाय उपयोगकर्ता को रीडायरेक्ट करने का प्रयास करते हैं और फिर- रीडायरेक्ट करने का प्रयास करते हैं। – TheTXI

+1

"शायद मुझे इसे शून्य छोड़ देना चाहिए।" - मैं उस भाग का जवाब दे रहा था –

0

मुझे लगता है कि यह काम करेगा स्थापित करने के लिए तैनात में से एक ...

create table atable 
(
    atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
    Modified datetime DEFAULT ((0)) 
) 

संपादित का उपयोग करें: यह गलत है ... कम से कम एसक्यूएल DateTi मुझे मूल्य 1/1/1753 है। मेरा समाधान एक डेटाटाइम = 1/1/1900 00:00:00 प्रदान करता है। अन्य उत्तरों में सही न्यूनतम तारीख है ...

+0

+1। जहां संशोधित = 0 कर रहा है SARGable है, जहां संशोधित है नल नहीं है। – Tomalak

+1

यह काम नहीं करेगा - 0 '1/1/1900' है। -536 9 0 आपको '1/1/1753' का मूल्य देगा। –

+0

एचएम। शायद मुझे यह नहीं मिला, लेकिन '1/1/1753' क्या है? और '1/1/1900' काम क्यों नहीं करेगा? – Tomalak

0

मुझे लगता है कि अपने ही यहाँ विकल्प के लिए एक स्थिर है। इसके साथ - इसका उपयोग न करें - फर्जी तिथियों के बजाय नल के साथ चिपके रहें।

create table atable 
(
    atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
    Modified datetime DEFAULT '1/1/1753' 
) 
5

जब तक आप एक सदी पहले की तुलना में अधिक ऐतिहासिक समय ट्रैक करने के लिए एक डीबी कर रहे हैं,

Modified datetime DEFAULT ((0)) 

का उपयोग कर पूरी तरह से सही सलामत है और '1753/01/01' की तुलना में अधिक सुंदर प्रश्नों की अनुमति देता है और NULL से अधिक कुशल प्रश्न।

हालांकि, बाद से पहले संशोधित datetime समय जिस पर रिकॉर्ड डाला गया था है, तो आप उपयोग कर सकते हैं:

Modified datetime NOT NULL DEFAULT (GETUTCDATE()) 

जो पूरे मुद्दे से बचा जाता है और अपने आवेषण आसान और सुरक्षित बनाता है - के रूप में आप नहीं है इसे बिल्कुल डालें और एसक्यूएल घर का काम करता है :-)

उस जगह के साथ आप व्यावहारिक न्यूनतम के रूप में 0 का उपयोग करके सुरुचिपूर्ण और तेज प्रश्न पूछ सकते हैं क्योंकि यह हमेशा किसी भी सम्मिलित जनरेटेड GETUTCDATE() से कम होने के लिए गारंटीकृत है।

14

मैं "जादू मूल्यों का उपयोग न करें" में भावना के साथ सहमत हूं। लेकिन मैं यह इंगित करना चाहता हूं कि ऐसे समय होते हैं जब ऐसे समाधानों का सहारा लेना वैध होता है।

स्तंभों को निरर्थक सेट करने के लिए भुगतान करने की कीमत है: NULL अनुक्रमिक नहीं हैं।एक प्रश्न "जैसे सभी रिकॉर्ड प्राप्त करें जिन्हें 2010 की शुरुआत से संशोधित नहीं किया गया है" में वे शामिल हैं जिन्हें कभी संशोधित नहीं किया गया है। अगर हम एक व्यर्थ स्तम्भ का उपयोग हम इस प्रकार का उपयोग करने के [संशोधित] < @cutoffDate या मजबूर कर रहे हैं [संशोधित] शून्य है, और बदले में इस के बाद से nulls अनुक्रमित नहीं कर रहे हैं, एक मेज स्कैन करने के लिए डेटाबेस इंजन बाध्य करती है। और यह अंतिम एक समस्या हो सकती है।

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

संक्षेप में, अंगूठे का deafult/शासन द्वारा एक शून्य के लिए जाना चाहिए। लेकिन यदि बड़ी संख्या में रिकॉर्ड हैं, तो डेटा अक्सर पूछताछ की जाती है, और रिकॉर्ड्स के केवल एक छोटे अनुपात में न्यूल/विशेष मूल्य होता है, इस जानकारी के आधार पर रिकॉर्ड ढूंढने के लिए महत्वपूर्ण प्रदर्शन लाभ हो सकता है (बशर्ते कोई भी बनाता है इंडेक्स!) और आईएमएचओ कभी-कभी "जादू" मानों के उपयोग को औचित्य साबित कर सकता है।

3

कभी-कभी आप भंगुर कोड है कि पहले से ही स्थानों का एक बहुत में जादू मूल्यों की उम्मीद कर प्राप्त करती हैं। हर कोई सही है, यदि संभव हो तो आपको न्यूल का उपयोग करना चाहिए। हालांकि, यह सुनिश्चित करने के लिए एक शॉर्टकट के रूप में कि उस मान के प्रत्येक संदर्भ समान है, मैं स्केलर फ़ंक्शन में SQL में "स्थिरांक" (बेहतर नाम की कमी के लिए) रखना चाहता हूं और फिर जब मुझे मूल्य की आवश्यकता होती है तो उस फ़ंक्शन को कॉल करें। इस तरह यदि मैं कभी भी उन्हें कुछ और करने के लिए अद्यतन करना चाहता हूं, तो मैं इतना आसानी से कर सकता हूं। या यदि मैं आगे बढ़ने वाले डिफ़ॉल्ट मान को बदलना चाहता हूं, तो मेरे पास इसे अपडेट करने के लिए केवल एक स्थान है।

निम्नलिखित कोड समारोह और एक मेज डिफ़ॉल्ट दिनांक समय मूल्य के लिए इसे प्रयोग पैदा करता है। फिर संशोधित के लिए मान निर्दिष्ट किए बिना तालिका से सम्मिलित करें और चुनें। फिर खुद के बाद साफ हो जाता है। आशा है कि ये आपकी मदद करेगा।

-- CREATE FUNCTION 
CREATE FUNCTION dbo.DateTime_MinValue () 
RETURNS DATETIME 
AS 
    BEGIN 
     DECLARE @dateTime_min DATETIME ; 
     SET @dateTime_min = '1/1/1753 12:00:00 AM' 
     RETURN @dateTime_min ; 
    END ; 
GO 


-- CREATE TABLE USING FUNCTION FOR DEFAULT 
CREATE TABLE TestTable 
(
    TestTableId INT IDENTITY(1, 1) 
        PRIMARY KEY CLUSTERED , 
    Value VARCHAR(50) , 
    Modified DATETIME DEFAULT dbo.DateTime_MinValue() 
) ; 


-- INSERT VALUE INTO TABLE 
INSERT INTO TestTable 
     (Value) 
VALUES ('Value') ; 


-- SELECT FROM TABLE 
SELECT TestTableId , 
     VALUE , 
     Modified 
FROM TestTable ; 


-- CLEANUP YOUR DB 
DROP TABLE TestTable ; 
DROP FUNCTION dbo.DateTime_MinValue ; 
संबंधित मुद्दे