2008-11-21 13 views
6

(। यह Floor a date in SQL server से संबंधित है)एसक्यूएल सर्वर: मंजिल एसक्यूएल सर्वर में एक तारीख है, लेकिन नियतात्मक रहना

एक नियतात्मक अभिव्यक्ति फर्श करने के लिए एक DATETIME मौजूद है? जब मैं एक गणना स्तंभ सूत्र के रूप में इस का उपयोग करें:

DATEADD(dd, DATEDIFF(dd, 0, [datetime_column]), 0) 

मैं कोई त्रुटि मिलती है जब मैं उस स्तंभ पर एक सूचकांक जगह:

सूचकांक नहीं बना सकता क्योंकि कुंजी स्तंभ 'EFFECTIVEDATE' गैर है निर्धारिती या अपमानजनक।

लेकिन दोनों DATEDIFF और DATEADD परिभाषा द्वारा निर्धारित कार्य हैं। पकड़ कहाँ है? क्या यह संभव है?

उत्तर

3

मेरा अनुमान है कि यह कुछ प्रकार की एक बग है। एसक्यूएल 2005 में मैं बिना किसी समस्या के इस तरह के एक अनुक्रमित दृश्य बनाने में सक्षम था (कोड नीचे है)। जब मैंने इसे SQL 2000 पर चलाने की कोशिश की, हालांकि मुझे वही त्रुटि मिली जो आपको मिल रही है।

निम्नलिखित SQL 2000 पर काम करता प्रतीत होता है, लेकिन मुझे चेतावनी मिलती है कि सूचकांक को अनदेखा कर दिया जाएगा और आपको दृश्य से चुने गए हर बार कनवर्ट करना होगा। एसक्यूएल 2005 में

CONVERT(CHAR(8), datetime_column, 112) 

काम करता है:

CREATE TABLE dbo.Test_Determinism (
    datetime_column DATETIME NOT NULL DEFAULT GETDATE()) 
GO 

CREATE VIEW dbo.Test_Determinism_View 
WITH SCHEMABINDING 
AS 
    SELECT 
     DATEADD(dd, DATEDIFF(dd, 0, [datetime_column]), 0) AS EffectiveDate 
    FROM 
     dbo.Test_Determinism 
GO 

CREATE UNIQUE CLUSTERED INDEX IDX_Test_Determinism_View ON dbo.Test_Determinism_View (EffectiveDate) 
GO 
2

क्या आपका कॉलम [datetime_column] का डिफ़ॉल्ट मान "getDate()" पर सेट है ??

यदि हां, के बाद से getdate() फ़ंक्शन nondeterministic है, यह इस त्रुटि का कारण होगा ...

उपयोगकर्ता परिभाषित समारोह नियतात्मक या गैर नियतात्मक है चाहे कैसे समारोह कोडित है पर निर्भर करता है। उपयोगकर्ता परिभाषित कार्य निर्धारक हैं यदि:

  1. फ़ंक्शन स्कीमा-बाध्य है।
  2. सभी अंतर्निहित या उपयोगकर्ता परिभाषित उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन द्वारा बुलाए गए फ़ंक्शंस निर्धारित हैं।
  3. फ़ंक्शन संदर्भ का संदर्भ फ़ंक्शन के दायरे के बाहर कोई डेटाबेस ऑब्जेक्ट नहीं है। उदाहरण के लिए, एक निर्धारक फ़ंक्शन तालिका चर के अलावा संदर्भ तालिका नहीं कर सकता जो फ़ंक्शन के लिए स्थानीय हैं।
  4. फ़ंक्शन किसी भी विस्तारित संग्रहीत प्रक्रियाओं को कॉल नहीं करता है।

उपयोगकर्ता-परिभाषित फ़ंक्शंस जो इन मानदंडों को पूरा नहीं करते हैं उन्हें नोडेटर्मिनिस्टिक के रूप में चिह्नित किया जाता है। उपयोगकर्ता द्वारा परिभाषित कार्यों के शरीर में अंतर्निहित नोडेटर्मेनिस्टिक कार्यों की अनुमति नहीं है।

+0

हां यह है। लेकिन त्रुटि कहां से आती है? – Tomalak

+0

getDate गैर-निर्धारिती है, मुझे विश्वास है कि – kristof

+0

कारण होगा हाँ हां यही कारण है! –

1

इस प्रयास करें:

CAST(FLOOR(CAST([datetime_column] as FLOAT)) AS DateTime) 

परिवर्तित विकल्प की तुलना में बहुत तेजी से जाना चाहिए।

+0

सीएएसटी डेटाटाइम मूल्यों के लिए गैर-निर्धारक है। – Tomalak

+0

अरे, यही वह है जो मैंने कोशिश की होगी। – StingyJack

0

that question asked and answered by Cade Roux पर देखें। शायद समाधान एक समारोह SCHEMABINDING के साथ का उपयोग कर बनाने और उसके बाद गणना स्तंभ

संपादित

मैं समझता हूँ कि आप लक्ष्य है कि स्तंभ पर एक सूचकांक के लिए सक्षम होने के लिए है कि में इसका उपयोग करना होगा।

यदि यह गणना किए गए कॉलम के साथ नहीं किया जा सकता है तो शायद एकमात्र विकल्प सामान्य कॉलम बनाना होगा और उस कॉलम में डेटा को प्रत्येक बार अपडेट करने पर उसे संशोधित करना होगा।(ट्रिगर में कहते हैं)

+0

मैंने कोशिश की है, टिप के लिए धन्यवाद। लेकिन हां, एक ही त्रुटि। – Tomalak

+0

क्या आप एक समाधान खोजने के लिए प्रबंधन किया था? – kristof

0

मैं कुछ सरल सुझाव देंगे:

cast(cast([datetime_column] as int) as datetime) 

लेकिन मुझे लगता है कि आप एक ही समस्या में पड़ जाएगा।

अब समस्या किसी डेटाटाइम पर कास्टिंग करने में है, तो आप केवल cast([datetime_column] as int) का उपयोग अलग-अलग फ़ील्ड के रूप में, इंडेक्स के लिए करने पर विचार करना चाहेंगे।

+0

समस्या उस समय के लिए * डेटाटाइम (या कन्वर्ट() आईएनजी से कास्टिंग * के साथ भी है। – Tomalak

1

यहाँ मूल सवाल का जवाब देने के लिए मेरे सबसे अच्छे जवाब है:

इस प्रयास करें:

/* create a deterministic schema bound function */ 
CREATE FUNCTION FloorDate(@dt datetime) 
RETURNS datetime 
WITH SCHEMABINDING 
AS 
BEGIN 
    RETURN CONVERT(datetime, FLOOR(CONVERT(float, @dt))) 
END 
GO 

, परीक्षण निम्नलिखित की कोशिश करने के लिए। बाद में कृपया गणना स्तंभ और के उपयोग के लिए "कायम" के उपयोग पर ध्यान दें [dbo।] जब समारोह

/*create a test table */ 
CREATE TABLE [dbo].[TableTestFloorDate](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [TestDate] [datetime] NOT NULL, 
    [TestFloorDate] AS ([dbo].[FloorDate]([TestDate])) PERSISTED, 
CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

अब आप गणना स्तंभ पर एक सूचकांक से जोड़ने के लिए सक्षम होना चाहिए की चर्चा करते हुए (लेकिन देख पकड़ लिया)

CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate) 

कई बार के रूप में कुछ यादृच्छिक डेटा सम्मिलित करें के रूप में आप चाहते हैं, लेकिन अधिक (1000+) आप सूचकांक उपयोग का परीक्षण करना चाहते हैं तो बेहतर है/निष्पादन की योजना बना रही

INSERT INTO TableTestFloorDate (TestDate) VALUES(convert(datetime, RAND()*50000)) 

जाओ परिणाम

SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2' 

अब यहां GOTCHA है ... गणना की गई कॉलम पर बनाई गई अनुक्रमणिका का उपयोग नहीं किया जाता है! इसके बजाए, लगातार फ़ील्ड टेस्टफ्लोरडेट पर डेटा चुनते समय, SQL सर्वर (या कम से कम मेरा संस्करण) टेस्टडेट पर एक इंडेक्स पसंद करता है।

CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate) 

मैं यकीन है कि (स्मृति से) अभिकलन सूचक, कायम थीं कि कॉलम एक प्रदर्शन के नजरिए से लाभ के हैं हूँ - मुझे लगता है कि तुम सिर्फ अपने स्वयं के विशिष्ट उपयोगों के लिए कोशिश/परीक्षण करना होगा

(आशा है कि मैंने मदद की है!)

+0

मेरे पास अभी परीक्षण करने का कोई तरीका नहीं है। क्या यह SQL Server 2000 संगत है (मुझे पता है कि यह प्राचीन है, लेकिन प्रश्न में टैग इस संस्करण को इंगित करते हैं)? – Tomalak

+0

उपर्युक्त एसक्यूएल -2012 में परीक्षण किया गया था लेकिन स्मृति से मुझे नहीं पता कि यह ऊपर वर्णित सटीक तरीके से एसक्ल 2k पर क्यों काम नहीं करेगा – dunxz

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