2011-09-13 13 views
5

क्या एक Microsoft SQL क्वेरी लिखना संभव है जो datetime डेटा-प्रकार द्वारा समूहित करेगा लेकिन समय और मिनट जैसे समय भाग को अनदेखा कर देगा?टाइमटाइम द्वारा समय-समय पर समूह

+2

SQL सर्वर का कौन सा संस्करण? यह इस विशेष प्रश्न के लिए मायने रखता है। (यह संभव है * SQL सर्वर के सभी संस्करणों में *, लेकिन 2008+ में एक बेहतर समाधान है) – RBarryYoung

+0

संभावित डुप्लिकेट [SQL सर्वर में डेटाटाइम को कैसे छीनना है] (http://stackoverflow.com/questions/923295/ कैसे-टू-ट्रंकेट-ए-डेटाटाइम-इन-एसक्यूएल-सर्वर) और [कई अन्य] (http://www.google.com/cse?cx=018205968162215846785%3A7n6ajnwyz-i&ie=UTF-8&q=sql+server+ truncate +% 28datetime | समय% 2 9 और sa = खोज और siteurl = www.google.com% 2 एफसीएसई% 2 फ़ॉम% 3 एफसीएक्स% 3 डी 018205968162215846785% 3A7n6ajnwyz-i) –

+1

@AndriyM - 'डेटाटाइम' के 'दिनांक' भाग द्वारा समूहित करना एक विशिष्ट अनुकूलन समस्या प्रस्तुत करता है यद्यपि तारीख भाग को तोड़ने से परे। जैसे 'तालिका तालिका टी 1 (डी डेटाटाइम 2 प्राथमिक कुंजी) की योजनाओं की तुलना करें; तालिका टी 2 (डी दिनांक, टी समय, प्राथमिक कुंजी (डी, टी) बनाएं); सीएएसटी (डी एएस DATE) विकल्प द्वारा टी 1 ग्रुप से COUNT (*) चुनें (ऑर्डर ग्रुप); डी विकल्प (ऑर्डर ग्रुप) द्वारा टी 2 ग्रुप से COUNT (*) चुनें ' –

उत्तर

12

यदि आप SQL Server 2008 पर हैं तो यह आसान है।

GROUP BY CAST(YourCol AS Date) 

पिछले संस्करणों के लिए आप

GROUP BY DATEDIFF(DAY, 0, YourCol) 

उपयोग कर सकते हैं हालांकि इनमें से कोई भी तथ्य यह है कि YourCol पर एक सूचकांक कि datetime द्वारा आदेश दिया गया है भी उपयोग date द्वारा आदेश दिया हो जाएगा और इस प्रकार का लाभ उठाने में सक्षम हो जाएगा बिना किसी प्रकार के ऑपरेशन के एक धारा।

SQL सर्वर 2008+ पर आप इस प्रकार की क्वेरी को सुविधाजनक बनाने के लिए datetime के बजाय (date,time) अनुक्रमणित करने पर विचार कर सकते हैं।

या तो बस दो अलग घटकों के रूप में यह भंडारण और संभवतः एक गणना स्तंभ भागों recombines प्रदान करके (एक datetime2 एक date के रूप में ही संग्रहीत किया जाता है और एक time तो यह करता है, तो अतिरिक्त के अलावा कोई भी अधिक स्थान का उपभोग नहीं होगा कॉलम NULL_BITMAP को एक नए बाइट पर धक्का देता है।)।

CREATE TABLE T 
(
YourDateCol date, 
YourTimeCol time, 
YourDateTimeCol AS DATEADD(day, 
          DATEDIFF(DAY,0,YourDateCol), 
          CAST(YourTimeCol AS DATETIME2(7))) 
/*Other Columns*/ 
) 

या वैकल्पिक रूप से आप संग्रहीत कर सकती है यह आधार तालिका में संयुक्त और अनुक्रमित परिकलित स्तंभों है कि यह बाहर विभाजित उपयोग किया है।

इस दृष्टिकोण

CREATE TABLE T 
(
DT DATETIME2, 
D AS CAST(DT AS DATE), 
T AS CAST(DT AS TIME) 
) 

CREATE INDEX IX1 ON T(DT); 

SELECT COUNT(*), 
     CAST(DT AS DATE) 
FROM T 
GROUP BY CAST(DT AS DATE) 

CREATE INDEX IX2 ON T(D,T); 

SELECT COUNT(*), 
     CAST(DT AS DATE) 
FROM T 
GROUP BY CAST(DT AS DATE) 

DROP TABLE T 

enter image description here

+3

'ग्रुप बाय डेटेडिफ (दिन, 0, योरकॉल)' शायद इस मामले में भी पर्याप्त होगा ... – Tomalak

+0

@ टोमालक - अच्छा बिंदु। वह 'int' को वापस कर देगा जो 'समूह द्वारा' के लिए पर्याप्त है और प्रदर्शन उद्देश्यों को छोड़कर 'डेटाटाइम' में वापस कनवर्ट करने का कोई कारण नहीं है। –

1

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

अपनी मेज पर एक अतिरिक्त datetime स्तंभ बना सकते हैं और यह एक ट्रिगर से आप "असली" तारीख आधार तिथि की गणना करता है के द्वारा भरा है

UPDATE 
    MyTable 
SET 
    EffectiveDate = DATEADD(DAY, 0, DATEDIFF(DAY, 0, t.RecordDate)) 
FROM 
    MyTable t 
    INNER JOIN inserted i ON i.RowID = t.RowID 

फिर EffectiveDate पर एक सूचकांक रख दिया और समूहीकरण (और खोज) बहुत तेज होगा।

+0

दिनांक के अनुसार SQL सर्वर 2008 कास्टिंग के लिए [sargable] है (http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable) हालांकि मैंने जांच नहीं की है कि यह लीवरेज हो गया है या नहीं 'प्रश्न से समूह'। –

+0

@ मार्टिन दिलचस्प, मुझे यह नहीं पता था। लेकिन कॉलम पर कोई अनुक्रमणिका नहीं होने पर यह अभी भी टेबल स्कैन ट्रिगर करेगा, है ना? – Tomalak

+0

क्यों एक ट्रिगर और एक गणना कॉलम नहीं? 'प्रभावशाली दिनांक AS CONVERT (DATETIME, DATEADD (DAY, 0, DATEDIFF (DAY, 0, t.RecordDate))) - इस कॉलम को सवारता के बारे में किसी भी संदेह को दूर करने के साथ-साथ किसी भी ओवरहेड के भुगतान के बिना, किसी भी संदेह को दूर करने और अनुक्रमित किया जा सकता है ट्रिगर। –

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