केवल तारीख भागों की तुलना करने के एसक्यूएल सर्वर datetime क्षेत्रों कन्वर्ट, अनुक्रमित लुकअप के साथ

वोट
28

मैं एक कर रहा हूँ convert(varchar,datefield,112)प्रत्येक तिथि क्षेत्र है कि मैं में उपयोग कर रहा हूँ प्रश्नों 'के बीच' एसक्यूएल सर्वर में सुनिश्चित करने के लिए कि मैं केवल दिनांकों के लिए लेखांकन रहा हूँ और नहीं याद आ रही पर किसी भी datetime क्षेत्रों के समय भाग पर आधारित है।

अब, मैं सुनवाई कर रहा हूँ कि धर्मान्तरित इंडेक्स करने योग्य नहीं हैं और वहाँ बेहतर तरीकों, SQL सर्वर 2005 में, एक प्रश्न में datetimes की तारीख हिस्सा तुलना करने के लिए निर्धारित करने के लिए तारीखों एक श्रेणी में आते हैं कि।

इष्टतम, इंडेक्स करने योग्य, कुछ इस तरह कर रही है की विधि क्या है:

select * from appointments
where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
09/12/2008 को 15:59
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
65

एक datetime मैदान के समय भाग पट्टी का सबसे अच्छा तरीका DateDiff और DATEADD कार्यों का उपयोग कर रहा है।

   DateAdd(day, datediff(day,0, MydateValue), 0)

यह इस तथ्य के AdvantEdge कि एसक्यूएल सर्वर भंडार दो पूर्णांकों, के रूप में तारीखें लेता है एक के बाद से दिनों की संख्या का प्रतिनिधित्व दिन "0" - (1 जनवरी 1900), और दूसरा एक जो की संख्या का प्रतिनिधित्व करता है टिक (प्रत्येक टिक 3.33 के बारे में एमएस है ) (बार) आधी रात के बाद से *।

बस उपरोक्त सूत्र केवल पहली पूर्णांक को पढ़ने के लिए है। कोई रूपांतरण या संसाधन की आवश्यकता है, इसलिए यह बहुत तेज है।

आपके प्रश्नों एक सूचकांक का उपयोग करने के लिए ... इनपुट पहले मानकों को छानने पर इस सूत्र का उपयोग, या तालिकाओं दिनांक समय क्षेत्र से बराबर के चिह्न के "अन्य" की ओर है, ताकि क्वेरी अनुकूलक गणना चलाने के लिए नहीं है तालिका में हर datetime मैदान पर निर्धारित करने के लिए कौन-सी पंक्तियां फ़िल्टर विधेय को संतुष्ट। यह आपके खोज तर्क बनाता है "Sarg करने योग्य" (खोज तर्क)

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 टिक (serendipitously सिर्फ अधिकतम मूल्य से नीचे एक 32 बिट पूर्णांक हो सकते हैं) कर रहे हैं। हालांकि, अगर आप इस बारे में चिंता करने के लिए जब हिसाब से एक datetime को संशोधित करने ... जब datetimes से मानों को जोड़कर या घटाकर आप जैसे कि यह वास्तव में एक दिन का आंशिक भाग के बराबर था एक अंश के रूप में मान इलाज कर सकते हैं जैसे कि, की जरूरत नहीं है पूरा datetime मूल्य एक चल बिन्दु एक पूर्णांक भाग तिथि और आंशिक भाग समय का प्रतिनिधित्व) का प्रतिनिधित्व करने से मिलकर नंबर था। अर्थात,

`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`
09/12/2008 को 16:07
का स्रोत उपयोगकर्ता

वोट
5

(मुक्केबाजी का एक प्रकार) स्ट्रिंग मूल्यों के लिए सांख्यिक प्रकार परिवर्तित कर आप के लिए क्या देख रहे का सबसे अच्छा प्रदर्शन करने वाले विधि नहीं है। इसका वास्तव में, सूचकांक करने योग्य के बारे में क्योंकि वास्तविक स्तंभ प्रकार की तारीख का समय है।

आप देख रहे हैं दिनांकों सबसे अच्छा तरीका है क्वेरी के लिए है, तो अपने उदाहरण सही है, लेकिन आप को ध्यान में MSSQL में 3 एमएस परिशुद्धता अंतर लेने के लिए कर सकते हैं। यह मतलब हो सकता है कि एक दिन से रिकॉर्ड एक और दिन के परिणाम में दिखा सकते हैं।

इस

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'

इस होना चाहिए

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
09/12/2008 को 16:11
का स्रोत उपयोगकर्ता

वोट
2

यह सही है - रूपांतरण करने पूछे हर पंक्ति के लिए रूपांतरण पर अमल होगा। यह दिनांकों के रूप में की तारीख कॉलम छोड़ देते हैं, और अपने जहां दिनांक के रूप में खंड में पारित करने के लिए बेहतर है:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

नोट: समय छोड़कर आधी रात (00: 00.000) का अर्थ है, ताकि आप 01/08 के लिए हर समय, और 15/08 से हर समय, और कुछ भी 2008/08/16 00:00:00 है कि वास्तव में शामिल होंगे

09/12/2008 को 16:06
का स्रोत उपयोगकर्ता

वोट
1

एक कॉलम अभिव्यक्ति आप की जरूरत की गणना कायम गणना की है। स्तंभों की गणना की और कायम रहे हैं, तो वे भी सूचीबद्ध किए जा सकते।

09/12/2008 को 16:10
का स्रोत उपयोगकर्ता

वोट
0

वहाँ भी जिस तरह से वर्णित है http://www.stillnetstudios.com/comparing-dates-without-times-in-sql-server/

SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)
28/09/2011 को 13:31
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more