2013-10-31 8 views
6

में तिथि और डेटाटाइम की समानता की तुलना करना मैं datetime फ़ील्ड के बराबर date फ़ील्ड के आधार पर पंक्तियों को वापस कर रहा हूं। dd/MM/yyyy = dd/MM/yyyy 00:00:00 के प्रारूप में जब वे स्पष्ट रूप से सीधे मेल खाते हैं लेकिन मैं उस समय की अवहेलना करना चाहता हूं।SQL सर्वर

3 विधियां हैं जिनकी मैंने कोशिश की है, वे सभी काम करते हैं, लेकिन मैं सोच रहा हूं कि सबसे अच्छा क्या है।

1 - CONVERT(varchar(10),MyDate,103) = CONVERT(varchar(10),MyDateTime,103))

2 - MyDate = CONVERT(date,MyDateTime)

3 - MyDate = CAST(MyDateTime AS date)

4 - MyDate = DATEADD(dd, DATEDIFF(dd, 0, MyDateTime), 0)

मेरे लिए

, # 1 सबसे धीमी होना चाहिए, स्ट्रिंग में कनवर्ट करने तो स्ट्रिंग तुलना का उपयोग कर निश्चित रूप से कम से कम कुशल होना चाहिए। लेकिन परीक्षणों में यह सबसे तेज़ है! नीचे मेरी परीक्षण है:

1 - 303ms औसत

2 - 284ms औसत

3 - 273ms औसत

4 - 1745ms औसत

टेस्ट ~ 300,000 का एक नमूना आकार से है

क्या इसके लिए कोई कारण है? क्या पहला विकल्प वास्तव में सबसे अच्छा विकल्प है?

संपादित करें: 300k रिकॉर्ड के लिए परीक्षणों को 10 गुणा चलाने के लिए परीक्षण मानों को बदल दिया गया है। परिणाम दिखाने के लिए परिणामों को बदलता है DATEADD/DATEDIFF विधि टिम श्मेल्टर के नीचे उल्लेख किया गया है। ऐसा लगता है कि अब तक कम से कम कुशल है।

+2

मैं 'DATEADD/DATEDIFF' दृष्टिकोण का उपयोग कर रहा हूं। http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server –

+0

करीबी अनुरोध के संदर्भ में, मुझे नहीं लगता कि यह एक डुप्लिकेट है क्योंकि इस तरह के दूसरे प्रश्न में समाधान के खिलाफ चला जाता है।यहां स्ट्रिंग रूपांतरण सबसे तेज़ है! 'DATEADD/DATEDIFF' – anothershrubery

+1

खाते में लेने के लिए संपादित प्रश्न यह नमूना आकार किस नमूना आकार पर आधारित है? –

उत्तर

4

मैं कहूंगा कि # 3 सबसे अच्छा विकल्प है। मेरे कारण यहां हैं।

आपने पहले ही प्रदर्शन कार्य किया है, इसलिए मैं इसे फिर से नहीं करूँगा। आपके अपडेट किए गए नंबर विकल्प 1-3 को बहुत समान दिखते हैं ताकि हम # 4 को रद्द करने के अलावा प्रदर्शन को अलग कर सकें।

एक बार प्रदर्शन सुलझाया गया है, यह सर्वोत्तम प्रथाओं और पठनीयता पर है। # 1 निश्चित रूप से सबसे अधिक कोड और पढ़ने के लिए सबसे कठिन है इसलिए मैं इसे बाहर कर दूंगा। इसी कारण से पहले से ही इनकार कर दिया गया है, # 4।

यह हमें # 2 और # 3 के साथ छोड़ देता है। मेरा चयन # 3 पर जाता है क्योंकि CAST SQL मानक का हिस्सा है और CONVERT से अधिक पोर्टेबल है। इसलिए, जब भी आपको CONVERT की विशेष विशेषताओं की आवश्यकता नहीं होती है, तो मैं हमेशा CAST का उपयोग करने की अनुशंसा करता हूं।

चेक अगर MyDateTime[MyDate, MyDate + 1 DAY) के बीच स्थित है:

+1

इसके अलावा, किसी फ़ंक्शन में फ़ील्ड को लपेटने से यह गैर-लाभकारी हो जाता है, जिसका अर्थ यह है कि किसी सूचकांक का उपयोग नहीं किया जा सकता है। यह # 3 –

+0

@ Nick.McDermaid के लिए एक और अच्छा कारण है 'CAST' एक समारोह नहीं है? –

+0

@ सलमान यह पोस्ट से स्पष्ट नहीं है लेकिन धारणा यह है कि 'माईडेट' एक कॉलम है और 'माईडेट टाइम' कॉलम नहीं है। –

1

तो MyDate एक पैरामीटर है तो एक पांचवां विकल्प है। यदि उस कॉलम पर कोई अनुक्रमणिका है तो यह क्वेरी इंडेक्स स्कैन के बजाय इंडेक्स की तलाश कर सकती है।

DECLARE @MyDate1 AS DATETIME = '2015-01-01'    -- 2015-01-01 00:00:00 
DECLARE @MyDate2 AS DATETIME = DATEADD(DAY, 1, @MyDate1) -- 2015-01-02 00:00:00 
SELECT ... WHERE MyDateTime >= @MyDate1 AND MyDateTime < @MyDate2