2016-01-14 7 views
5

यहाँ के बीच मेरे कोड है: मेरी एसक्यूएल 2008 सर्वर उदाहरण पर अभी तकएसक्यूएल सर्वर 2008 समारोह

DECLARE @d1 DATETIME 
DECLARE @d2 DATETIME 

SET @d1 = '2015-01-01 00:00:00' 
SET @d2 = '2015-12-31 23:59:59.999' 

SELECT 
    CASE 
     WHEN ('2016-01-01 00:00:00' BETWEEN @d1 AND @d2) 
      THEN 'is between' 
      ELSE 'not between' 
    END AS BetweenOrNotBetween 

तारीख मैं यहाँ की आपूर्ति 1 msec बाद मेंBETWEEN समारोह की सीमा से अधिक है, , परिणाम है और नहीं 'के बीच है' उम्मीद 'के बीच नहीं' ...

यह एक बग है, या किसी कारण मुझे नहीं दिखाई दे रही है के लिए डिजाइन में एक आवश्यक समझौता है?

और हाँ, जैसे ही मैं 2016-01-01 के मध्यरात्रि से परे एक सेकेंड का एक अंश भी जोड़ता हूं, मुझे उम्मीद है कि ' परिणाम' के बीच नहीं है।

+1

उसी डेटा को 'DATETIME2 (3) 'के साथ अपने डेटाटाइप के रूप में आज़माएं - और यह काम करेगा। एसक्यूएल सर्वर 2008 के रूप में, जब भी आप –

उत्तर

7

datetime type के लिए प्रलेखन देखें। अनुभाग Rounding of datetime Fractional Second Precision में आप अपने मुद्दे पर स्पष्टीकरण मिलेगा:

datetime मूल्यों, .000, .003, या .007 सेकंड की दर से वृद्धि करने के लिए गोल कर रहे हैं के रूप में निम्न तालिका में दिखाया गया है।

इसका मतलब है कि यदि आपके पास 1 मिलीसेकंड है, तो यह वास्तव में 0 मिलीसेकंड तक गोल होता है, इसलिए आपका परिणाम is between है। दुर्भाग्यवश यह है कि कैसे datetime डेटा प्रकार काम करता है, इसके बारे में आप इतना कुछ नहीं कर सकते हैं, जब तक कि आप अन्य डेटा प्रकार का उपयोग नहीं कर सकते, जैसे datetime2

+0

सड़े हुए मांस की तरह डूब सकते हैं, तो मैं 'DATETIME' के बजाय' DATETIME2 (3) 'का उपयोग करने की अनुशंसा करता हूं! तो आखिरी मिलीसेकंद तक, कैलेंडर वर्ष में सभी vals कैसे प्राप्त करें? निश्चित रूप से, यह संभव है, लेकिन यह kludgy होना चाहिए। –

+2

@ बीक्लेशैनन 'डेटटाइम 2' या 'डेटटाइम ऑफसेट' आपको लचीलापन – JamieD77

+0

उत्तर dotnetom के लिए धन्यवाद देता है। तो यह तब "आवश्यक समझौता" है। –

2

यदि आप नीचे दिए गए कोड का उपयोग करते हैं, तो आप देखेंगे कि समस्या डेटाटाइम प्रकार है। डेटाटाइम के बारे में प्रलेखन देखें और आपका संदेह हल हो जाएगा!

DECLARE @d1 datetime2 
DECLARE @d2 datetime2 

SET @d1 = '2015-01-01 00:00:00.00' 
SET @d2 = '2015-12-31 23:59:59.999' 

SELECT CASE WHEN ('2016-01-01 00:00:00.00' BETWEEN @d1 AND @d2) THEN 'is between' 
     ELSE 'not between' 
     END AS BetweenOrNotBetween 
संबंधित मुद्दे