डेटाटाइम फ़ील्ड के समय भाग को अलग करने का सबसे अच्छा तरीका दिनांकित और डेटेड फ़ंक्शन का उपयोग करना है।
DateAdd(day, datediff(day,0, MydateValue), 0)
यह इस तथ्य का लाभ उठाता है कि SQL सर्वर दिनांक को दो पूर्णांकों के रूप में संग्रहीत करता है, एक दिन "0" - (1 जनवरी 1900) से दिनों की संख्या का प्रतिनिधित्व करता है, और दूसरा जो टिकों<की संख्या का प्रतिनिधित्व करता है। /em> (प्रत्येक टिक लगभग 3.33 एमएस है) मध्यरात्रि से (उस समय के लिए) *।
उपरोक्त सूत्र को केवल पहले पूर्णांक को पढ़ना है। कोई रूपांतरण या प्रसंस्करण की आवश्यकता नहीं है, इसलिए यह बहुत तेज़ है।
अपने प्रश्नों को एक अनुक्रमणिका का उपयोग करने के लिए... पहले इनपुट फ़िल्टरिंग पैरामीटर पर इस सूत्र का उपयोग करें, या तालिका दिनांक समय फ़ील्ड से बराबर चिह्न के "अन्य" पक्ष पर, ताकि क्वेरी अनुकूलक को गणना चलाने की आवश्यकता न हो तालिका में प्रत्येक डेटाटाइम फ़ील्ड पर यह निर्धारित करने के लिए कि कौन सी पंक्तियाँ फ़िल्टर विधेय को संतुष्ट करती हैं। यह आपके खोज तर्क को "SARG-able" (Search ARGument) बनाता है
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
के बजाय
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* टिप्पणी। आंतरिक रूप से, दूसरा पूर्णांक (समय भाग) टिक को संग्रहीत करता है। एक दिन में 24 x 60 X 60 X 300 =25,920,000 टिक होते हैं (एक 32 बिट पूर्णांक धारण कर सकने वाले अधिकतम मान के ठीक नीचे)। हालांकि, आपको इस बारे में चिंता करने की ज़रूरत नहीं है जब अंकगणितीय रूप से डेटाटाइम को संशोधित करते हैं... डेटाटाइम्स से मूल्यों को जोड़ते या घटाते समय आप मान को एक अंश के रूप में मान सकते हैं जैसे कि यह एक दिन के आंशिक हिस्से के बराबर था, जैसे कि पूर्ण डेटाटाइम मान एक फ़्लोटिंग पॉइंट नंबर था जिसमें दिनांक का प्रतिनिधित्व करने वाला एक पूर्णांक भाग और समय का प्रतिनिधित्व करने वाला आंशिक भाग होता है)। यानी,
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`