2010-09-20 15 views
8

में मानों के बीच दिनांक के लिए एसक्यूएल खोज करें, मेरे पास एक टी-एसक्यूएल संग्रहीत प्रक्रिया है जहां मैं एक विशेष मूल्य खोजना चाहता हूं और वैकल्पिक रूप से विशेष तारीखों को खोज को सीमित कर देता हूं यदि वे पास हो जाते हैं। यदि शून्य मान हैं इन तिथियों में से किसी एक के लिए पारित किया गया, तो मैं उनको अनदेखा करना चाहता हूं। जिस तरह से मैं इनपुट तारीखों को कम से कम या अधिकतम पर सेट करके ऐसा करने के बारे में सोच रहा हूं, यदि वे शून्य हैं। हालांकि मैं न्यूनतम और अधिकतम मूल्यों को हार्डकोड नहीं करना चाहूंगा। इसलिए मैं सोच रहा हूं कि सी # DateTime.MaxValue और DateTime.MinValue के एसक्यूएल समकक्ष क्या हैं।शून्य

मैं वहाँ है तो

SELECT EmployeeName FROM Employee 
WHERE EmployeeID = @EmployeeId AND 
Birthday BETWEEN Coalesce(@StartDate, <MinDateTime>) AND 
       Coalesce(@EndDate, <MaxDateTime>) 

तरह संगठित होना का उपयोग कर की सोच रहा हूँ एक समारोह/लगातार/चर/enum मैं <MinDateTime> और <MaxDateTime> चर के लिए उपयोग कर सकते हैं में बनाया गया?

कोई सुझाव?

उत्तर

11

SQL सर्वर में ऐसी कोई कार्यक्षमता नहीं है। आप आसानी से min and max dates बीओएल (1753-01-01 - 9999-12-31) में अनुमति दे सकते हैं। या आप आसानी से एक और तारीख हार्ड कोड कर सकते हैं (यदि आप वास्तव में जन्मदिन के साथ काम कर रहे हैं, 1800-01-01 - 2100-12-31 शायद पर्याप्त होगा)।

SELECT EmployeeName FROM Employee 
WHERE EmployeeID = @EmployeeId AND 
Birthday BETWEEN Coalesce(@StartDate, Birthday) AND 
       Coalesce(@EndDate, Birthday) 

लेकिन ध्यान दें कि यह जरूरी बहुत बड़ी तालिकाओं के लिए अच्छी तरह से स्केल नहीं करेगा: या आप सकता है (अगर यह सीमा क्वेरी आप दिखाया है है), सम्मिलित वापस जन्मदिन खुद पर गिर कर सकते है।

के बाद संपादित स्वीकार करते हैं,, आम तौर पर ओपी से टिप्पणी करने के लिए

एसक्यूएल के लिए, प्रतिक्रिया करने के लिए अगर आप की आवश्यकता होगी, कर रहे हैं "संदर्भ" डेटा बार-बार, तो आप इसे अपने आप को एक तालिका के रूप में जोड़ें। ("कैलेंडर तालिका" या "संख्या तालिका एसक्यूएल" के लिए Google)। तो इस उदाहरण में, यदि आप, आप एक "स्थिरांक" (या शायद "सीमा" तालिका) जोड़ सकते हैं चाहता था:

create table Constants (
    Lock char(1) not null, 
    datetimeMin datetime not null, 
    datetimeMax datetime not null, 
    intMin int not null, 
    intMax int not null, 
    /* Other Min/Max columns, as required */ 
    constraint PK_Constants PRIMARY KEY (Lock), 
    constraint CK_Constants_Locked CHECK (Lock='X') 
) 
insert into Constants (Lock,datetimeMin,datetimeMax,intMin,intMax) 
select 'X','17530101','99991231',-2147483648,2147483647 

जो तुम तो प्रश्नों में संदर्भ सकता है (या तो एक subselect के माध्यम से, या पार से शामिल होने के इस तालिका में)। जैसे

SELECT EmployeeName 
FROM Employee, Constants 
WHERE EmployeeID = @EmployeeId AND 
Birthday BETWEEN Coalesce(@StartDate, Constants.datetimeMin) AND 
       Coalesce(@EndDate, Constants.datetimeMax) 

(लॉक, प्राथमिक कुंजी, और बाधा की जाँच करें एक साथ काम करने के लिए सुनिश्चित करें कि केवल एक ही पंक्ति कभी इस तालिका में उपलब्ध नहीं होगा,), एसक्यूएल सर्वर के लिए

+0

बहुत ही रोचक। मैंने कभी कोलेसेस (@ स्टार्टडेट, जन्मदिन) पैटर्न पहले कभी नहीं देखा था। मुझे लगता है कि मैक्सडेट और दिमागी नामक एक चर बनाने और हार्डकोडेड तिथियों में इसके मान सेट करना बहुत अधिक पठनीय हो सकता है। लेकिन हाँ, मैं जिस मुख्य जानकारी की तलाश कर रहा था वह एसक्यूएल – Chaitanya

+0

में सीमल्स/स्थिरांक की कमी थी, कोलासिस चाल - +1 यह बयान में है कि यह बड़ी तालिकाओं के लिए स्केल नहीं करेगा, SQL सर्वर इंडेक्स का उपयोग करने में सक्षम नहीं प्रतीत होता है जन्मदिन कॉलम पर। हार्ड कोडिंग न्यूनतम और अधिकतम तिथियां इंडेक्स के साथ अच्छी तरह से काम करती हैं। संदर्भों के लिए –

3

न्यूनतम या अधिकतम दिनांक समय मान प्राप्त करने के लिए कोई भी कार्य नहीं किया गया है। आपको मूल्यों को हार्ड कोड करना होगा या डेटाबेस से मानों को पुनर्प्राप्त करना होगा।

यदि पैरामीटर NULL हैं तो आप तालिका से अधिकतम & अधिकतम तिथियां चुन सकते हैं।

IF (@StartDate IS Null) 
BEGIN 
SELECT @StartDate = MIN(Birthday) FROM Employee 
END 


IF (@EndDate IS Null) 
BEGIN 
SELECT @EndDate = MAX(Birthday) FROM Employee 
END 

SELECT EmployeeName FROM Employee 
WHERE EmployeeID = @EmployeeId AND 
Birthday BETWEEN @StartDate AND @EndDate 
+1

मुझे नहीं लगता कि यह क्या चैतन्य का मतलब है। –

+0

+1 यह ठीक नहीं हो सकता है कि चैतन्य क्या मांग रहा था लेकिन यह पर्याप्त आवश्यकताओं को पूरा करता है। न्यूनतम और अधिकतम डेटाटाइम की कोई हार्डकोडिंग आवश्यक नहीं है और उसी क्वेरी का उपयोग शून्य मामलों के लिए भी किया जा सकता है साथ ही – InSane

4

विशेष रूप से बोल के अनुसार, सीमा नहीं है :

  • datetime: 1753/01/01 00:00:00 के माध्यम से 9999-12-31 23: 59: 59,997
  • smalldatetime: 1900/01/01 00:00:00 के माध्यम से 2079-06- 06 23: 5 9: 2 9.9 8
  • date: 0001-01-01 99 99-12-31
  • datetime2: 0001-01-01 00:00:00 99 99-12-31 23:59:59 के माध्यम से।99 99 999

जैसा कि आप देख सकते हैं, यह आपके सटीक डेटा प्रकार पर निर्भर करता है।

क्वेरी के लिए के रूप में, मैं इसे इस तरह करना होगा:

SELECT EmployeeName 
FROM Employee 
WHERE EmployeeID = @EmployeeId 
AND (@StartDate IS NULL 
    OR Birthday >= @StartDate) 
AND (@EndDate IS NULL 
    OR Birthday <= @EndDate) 
+0

+1। क्वेरी के लिए - इसे परीक्षण करने की आवश्यकता है, 'के बीच ... COALESCE' क्वेरी प्लानर के लिए अधिक समझदार हो सकता है। – Unreason

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