2011-03-24 10 views
5

मेरे पास एक फॉर्म है, जहां उपयोगकर्ता एक रिपोर्ट खींचता है। फॉर्म में वे एक प्रारंभ तिथि और समाप्ति तिथि चुन सकते हैं, या दोनों मानों के लिए शून्य के माध्यम से गुजर सकते हैं। वे अशक्त चुनते हैं, तो यह सभी रिकॉर्ड जहां EFFECTIVEDATE < GETDATE() मामला बयान के बीच की तरह प्रतीत नहीं होता है देता है, और न ही तरह '<' ऑपरेटरों यह होता हैSQL केस में BETWEEN का उपयोग जहां क्लॉज

यहाँ मेरी स्क्रिप्ट है

SELECT * FROM tbReport 
WHERE 
    EffectiveDate 
    CASE 
     WHEN (@StartDate IS NOT NULL AND @EndDate IS NOT NULL) 
     THEN BETWEEN (@StartDate AND @EndDate)   
     ELSE 
        THEN < GETDATE() 

    END 

उत्तर

7

आप एक मामले के बिना यह पुनर्लेखन कर सकता है, जैसे:

SELECT * 
FROM tbReport 
WHERE (
      @StartDate is not null 
      and 
      @EndDate is not null 
      and 
      EffectiveDate between @StartDate AND @EndDate 
     ) 
     or 
     (
      (
       @StartDate is null 
       or 
       @EndDate is null 
      ) 
      and 
      EffectiveDate < getdate() 
     ) 
+0

धन्यवाद यह उत्तर मुझे सबसे ज्यादा समझ में आता है और सभी शर्तों को ध्यान में रखता है। – MeltdownZA

+0

यह काम करता है लेकिन क्या यह आवश्यक है कि यह आवश्यक नहीं है? यह एक रखरखाव दृष्टिकोण से मेरी पहली पसंद नहीं होगी। – SecretDeveloper

0

मामले के लिए आपका वाक्य रचना सब गलत यहाँ है .. बजाय इस प्रयास करें: यह है एसक्यूएल सर्वर मान लिया जाये कि

SELECT * FROM tbReport 
WHERE 
    (@StartDate is null and @EndDate is null and EffectiveDate < GetDate()) or 
    (@StartDate is not null and @EndDate is not null and 
    EffectiveDate >= @StartDate and EffectiveDate <= @EndDate) 
+0

हालांकि यह एक बहुत अच्छा चयन है .. आपको पहले @startdate और @enddate (@StartDate शून्य या @EndDate शून्य है) और प्रभावी डेटा

2

, आप isnull का उपयोग करके यह सरल बना सकते हैं:

+०१२३५१६४१०
select * 
from tbReport 
where EffectiveDate between isnull(@StartDate, '1 Jan 1990') 
     and isnull(@EndDate, getdate()) 
+0

+1 शायद ओपी का मतलब है और बहुत संक्षिप्त – Andomar

+0

दुर्भाग्यवश यह ध्यान में नहीं आता है कि यदि कोई भी तारीख शून्य है, तो सभी रिकॉर्ड लौटाएं जहां MeltdownZA

+0

यद्यपि आप BETWEEN निकालते हैं और इसके बजाय उपयोग करते हैं जब आप पैराम नल होते हैं तो आप संभालते हैं। मेरा जवाब देखने के लिए मेरा जवाब देखें। – SecretDeveloper

2

कुछ इस तरह काम करना चाहिए, मैं जाँच की नहीं की वाक्य रचना हालांकि सही है।

SELECT * FROM tbReport 
WHERE EffectiveDate < IsNull(@EndDate,GetDate()) 
AND EffectiveDate > IsNull(@StartDate,'01/01/1979') 
0

SQL कथन सही लिखा नहीं गया है। केस सशर्त रूप से मूल्यांकन कोड नहीं चुना जाएगा। आप मामले को एक मान के रूप में देख सकते हैं, इसलिए आपको ऑपरेटर को केस और अन्य ऑपरेंड के बीच रखना होगा।

लेखन इस होगा के कई तरीकों में से एक:

where 
case when @StartDate IS NOT NULL AND @EndDate IS NOT NULL and EffectiveDate BETWEEN (@StartDate AND @EndDate) then 1 
case when (@StartDate IS NULL OR @EndDate IS NULL) and EffectiveDate <getdate() then 1 
else 0 end = 1 

आप मामले से यह लिखने के लिए इससे पहले कि आप समाधानों में से एक चुन सकते हैं नहीं करना चाहती हैं, लेकिन वे एक असतत प्रारंभ दिनांक का उपयोग करते हैं।

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