2009-09-15 10 views
50

मैं एमएस एसक्यूएल 2005 का उपयोग कर रहा हूं, और मैं समानता के लिए दो तिथियां जांचना चाहता हूं, लेकिन समय के हिस्से को अनदेखा करना चाहता हूं।टी-एसक्यूएल में दिनांकों की तुलना करें, समय भाग को अनदेखा करें

मुझे पता है कि मैं DATEDIFF का उपयोग कर सकता हूं, लेकिन मुझे चिंता है कि यह धीमा हो सकता है - यह एसपी डीबी में बहुत उपयोग किया जाता है!

कोई सुझाव?

संपादित करें: डेविड एन्ड्रेस 'टिप्पणी:

' "तुलना" समानता से '
भी बहुत कुछ शामिल है मुझे एहसास किया कि मैं अपने प्रश्न काफी स्पष्ट नहीं किया है - मैं वास्तव में सिर्फ समानता के लिए जाँच कर रहा हूँ, बस इतना ही है ।

+10

समयपूर्व अनुकूलन से चिंतित न हों: 'DATEDIFF' का उपयोग करके अपनी क्वेरी लिखें, फिर देखें कि यह एक बाधा है या क्वेरी योजना की जांच नहीं कर रहा है। यदि यह एक समस्या है, तो एक विकल्प की तलाश करें। – Welbog

+0

[SQL सर्वर में डेटाटाइम के समय भाग को हटाने के लिए सर्वोत्तम दृष्टिकोण] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql- सर्वर) – abatishchev

उत्तर

81

यह करने के लिए केवल उचित तरीका datetime मूल्यों के समय भाग दूर पट्टी और परिणाम है, और सबसे अच्छा तरीका है एक दिनांक-समय भाग पट्टी तुलना करने के लिए है इस तरह है:

cast(current_timestamp as date)  

मैं का उपयोग करें और एक प्रक्रिया है कि निम्नांकित दो पंक्तियों में से एक की तरह लग रहा था की वकालत करते थे:

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

लेकिन अब जब Sql सर्वर Date प्रकार है, जो एक समय घटक पकड़ नहीं है, या तो उपयोग करने के लिए कोई कारण है उन तकनीकों का।

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

अंत में, ध्यान दें कि DATEDIFF फ़ंक्शन पार की सीमाओं की संख्या की तुलना करता है। तो '2009-09-14 11:59:59' और '2009-09-15 00:00:01' के बीच के दिनों में दिनांकित 1 है, भले ही केवल 2 सेकंड बीत चुके हैं, लेकिन '2009-09-15 00:00:01' और '2009-09-15 11:59:59' के बीच के दिनों में DATEDIFF अभी भी शून्य है, भले ही 86,398 सेकंड बीत गए हों। ध्यान दें कि यह वास्तव में उस समय के हिस्से के बारे में बिल्कुल परवाह नहीं करता है। आपकी क्वेरी क्या करने का प्रयास कर रही है, इस पर निर्भर करता है कि आप इसका उपयोग अपने लाभ के लिए कर सकते हैं।

+3

क्या यह _DATEDIFF (दिन, दिनांक 1, दिनांक 2) _ का उपयोग करने से कम कुशल नहीं होगा? –

+0

मैं एक संपादन पर काम कर रहा था- अब तैयार है। –

+2

मैं वास्तव में समय को बंद करने का कोई तरीका नहीं ढूंढ रहा था, लेकिन समय की अनदेखी करने वाली दो तिथियों की तुलना करने का एक तरीका। यह मेरे लिए थोड़ा धीमा दिखता है .. –

6

अपने ही काम करते हैं, जब मैं निर्धारित करने के लिए कि दो तिथियों के बराबर थे चाहता था में भले ही दिन के समय की है, मैं का उपयोग किया है निम्नलिखित:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

दी, "तुलना" भी शामिल है समानता की तुलना में अधिक और उपर्युक्त तुलना करने से पहले उपरोक्त दिनांक संयुक्त राज्य अमरीका प्रारूप एमएम/डीडी/वाई वाई वाईवाई में परिवर्तित करता है। तो, प्रदर्शन के प्रभाव और तिथि मतभेदों की तुलना करने में असमर्थता।

लेकिन ... यह काम करता है।

4

यदि आपकी व्यावसायिक आवश्यकताओं में से कोई एक आपके डेटा मॉडल द्वारा अच्छी तरह से सेवा नहीं करता है (उदाहरण के लिए, आपको तिथियों की तुलना करने की आवश्यकता है, लेकिन आप तिथियों का ट्रैक नहीं रखते हैं, केवल तारीख-प्लस-टाइम्स), मॉडल को ट्यून करने की संभावना को देखो, इसके साथ मुकाबला करने की विधि नहीं।

क्या केवल एक अनुक्रमित गणना वाले कॉलम में तारीख को स्टोर करना या तारीख और समय के हिस्सों को अलग-अलग स्टोर करना संभव और उपयोगी होगा?

33

कहां DateDiff (दिन, DATE1, DATE2) = 0

2

देर उत्तर के लिए क्षमा करें।

मैं हमेशा तिथि तुलना के लिए इस वाक्य विन्यास का उपयोग

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

यह हमेशा अच्छा काम करता है जब भी हम 112 प्रारूप कोड के साथ तारीख यह yyyyMMdd प्रारूप में वापसी तिथि को परिवर्तित। यह समय के बिना स्ट्रिंग प्रारूप में तारीख की तुलना करता है लेकिन महान काम करता है। धन्यवाद

+0

आपका समाधान उस स्क्रिप्ट पर काम करता था जिसे मैं लिख रहा था जब "IF date_column! = GETDATE()" नहीं था। क्या आपको पता है कि ऐसा क्यों है? – CryptoJones

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