क्या एक Microsoft SQL क्वेरी लिखना संभव है जो datetime
डेटा-प्रकार द्वारा समूहित करेगा लेकिन समय और मिनट जैसे समय भाग को अनदेखा कर देगा?टाइमटाइम द्वारा समय-समय पर समूह
उत्तर
यदि आप 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
'ग्रुप बाय डेटेडिफ (दिन, 0, योरकॉल)' शायद इस मामले में भी पर्याप्त होगा ... – Tomalak
@ टोमालक - अच्छा बिंदु। वह 'int' को वापस कर देगा जो 'समूह द्वारा' के लिए पर्याप्त है और प्रदर्शन उद्देश्यों को छोड़कर 'डेटाटाइम' में वापस कनवर्ट करने का कोई कारण नहीं है। –
आप एक बड़ी मेज है और तेजी होने की समूहीकरण चाहते हैं का एक उदाहरण के लिए, आप एक अभिव्यक्ति पर समूहीकरण भरोसा नहीं कर सकते।
अपनी मेज पर एक अतिरिक्त 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
पर एक सूचकांक रख दिया और समूहीकरण (और खोज) बहुत तेज होगा।
दिनांक के अनुसार SQL सर्वर 2008 कास्टिंग के लिए [sargable] है (http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable) हालांकि मैंने जांच नहीं की है कि यह लीवरेज हो गया है या नहीं 'प्रश्न से समूह'। –
@ मार्टिन दिलचस्प, मुझे यह नहीं पता था। लेकिन कॉलम पर कोई अनुक्रमणिका नहीं होने पर यह अभी भी टेबल स्कैन ट्रिगर करेगा, है ना? – Tomalak
क्यों एक ट्रिगर और एक गणना कॉलम नहीं? 'प्रभावशाली दिनांक AS CONVERT (DATETIME, DATEADD (DAY, 0, DATEDIFF (DAY, 0, t.RecordDate))) - इस कॉलम को सवारता के बारे में किसी भी संदेह को दूर करने के साथ-साथ किसी भी ओवरहेड के भुगतान के बिना, किसी भी संदेह को दूर करने और अनुक्रमित किया जा सकता है ट्रिगर। –
- 1. समूह द्वारा
- 2. पायथन टाइमटाइम
- 3. एचबीएएस द्वारा समूह
- 4. BigQuery: QUANTILES के लिए समूह द्वारा समूह
- 5. समूह द्वारा auto_increment
- 6. COUNT/समूह द्वारा
- 7. MySQL समूह द्वारा घंटे
- 8. row_number() समूह द्वारा?
- 9. MySQL समूह द्वारा
- 10. पहले चरित्र द्वारा समूह
- 11. क्वेरी द्वारा लिंक समूह
- 12. समूह उर्फ (Oracle) द्वारा
- 13. समूह मूल्य द्वारा रैंड()
- 14. "द्वारा समूह" MongoDB में
- 15. Sql - द्वारा समूह, होने
- 16. पांडस द्वारा समूह
- 17. mysql समूह द्वारा और प्रत्येक समूह
- 18. "द्वारा क्रमबद्ध" परिणाम "समूह द्वारा" गिनती?
- 19. MySQL द्वारा/क्रम धीमा समूह
- 20. दिन निर्मित समूह द्वारा निर्मित
- 21. अजगर - समूह द्वारा और tuples
- 22. LINQ समूह माह प्रश्न द्वारा
- 23. MySQL समूह द्वारा और हैविंग
- 24. HIVE - तिथि समारोह द्वारा समूह
- 25. एसक्यूएल: समूह द्वारा कॉन्सेक्टीव रिकॉर्ड्स
- 26. समूह नाम (पायथन, यूनिक्स) द्वारा समूह आईडी प्राप्त करें
- 27. परिणाम के बाद ऑर्डर समूह द्वारा LINQ समूह
- 28. समूह सप्ताहों/महीनों पर स्थित दिनांक सीमा अंतराल द्वारा
- 29. एकाधिक स्तंभों द्वारा एसक्यूएल सर्वर समूह केवल एक कॉलम पर
- 30. समूह और अन्य स्थिति पर आईडी द्वारा न्यूनतम और अधिकतम
SQL सर्वर का कौन सा संस्करण? यह इस विशेष प्रश्न के लिए मायने रखता है। (यह संभव है * SQL सर्वर के सभी संस्करणों में *, लेकिन 2008+ में एक बेहतर समाधान है) – RBarryYoung
संभावित डुप्लिकेट [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) –
@AndriyM - 'डेटाटाइम' के 'दिनांक' भाग द्वारा समूहित करना एक विशिष्ट अनुकूलन समस्या प्रस्तुत करता है यद्यपि तारीख भाग को तोड़ने से परे। जैसे 'तालिका तालिका टी 1 (डी डेटाटाइम 2 प्राथमिक कुंजी) की योजनाओं की तुलना करें; तालिका टी 2 (डी दिनांक, टी समय, प्राथमिक कुंजी (डी, टी) बनाएं); सीएएसटी (डी एएस DATE) विकल्प द्वारा टी 1 ग्रुप से COUNT (*) चुनें (ऑर्डर ग्रुप); डी विकल्प (ऑर्डर ग्रुप) द्वारा टी 2 ग्रुप से COUNT (*) चुनें ' –