मैं पार्टी के लिए सुपर लेट हूं, लेकिन यह मौजूदा जवाबों में से किसी में भी दिखाई नहीं देता:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
10
और MINUTE
शर्तों किसी भी नंबर पर बदला जा सकता है और DATEPART
क्रमश:।
- यह एक
DATETIME
मूल्य है, जिसका अर्थ है:
- यह लंबे समय के अंतराल पर ठीक काम करता है। (वर्षों के बीच कोई टक्कर नहीं है।)
- इसे
SELECT
बयान में शामिल करने से आपके आउटपुट को आपके द्वारा निर्दिष्ट स्तर पर सुंदर आउटपुट के साथ एक कॉलम मिलेगा।
'2000'
एक "लंगर तिथि" है जिसके चारों ओर एसक्यूएल तारीख गणित करेगा। नीचे Jereonh ने पाया कि आप पिछले एंकर ( 0
) के साथ एक पूर्णांक ओवरफ़्लो का सामना करते हैं, जब आप सेकंड या मिली सेकंड द्वारा हाल ही की तारीखों को समूहीकृत करते हैं। †
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
AS [date_truncated],
COUNT(*) AS [records_in_interval],
AVG(aa.[value]) AS [average_value]
FROM [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
अपने डेटा फैला सदियों, तो ‡ दूसरी के लिए एक एकल लंगर दिनांक का उपयोग कर या मिलीसेकंड समूहीकरण अभी भी अतिप्रवाह का सामना करेंगे। यदि ऐसा हो रहा है, तो आप प्रत्येक पंक्ति को अपनी स्वयं की तिथि की मध्यरात्रि की तुलना में बिनिंग की लंगर लगाने के लिए कह सकते हैं:
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
इसके बजाय '2000'
इसका उपयोग करें जहाँ यह ऊपर दिखाई देता है। आपकी क्वेरी पूरी तरह से अपठनीय होगी, लेकिन यह काम करेगा।
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
प्रतिस्थापन के रूप में एक विकल्प हो सकता है ।
† 2 32 9 4.29E + 9, इसलिए यदि आपका DATEPART
है SECOND
, तो आपको दोनों तरफ 4.3 बिलियन सेकंड मिलते हैं, या "लंगर anch 136 साल।" इसी तरह, 2 32 मिलीसेकंड is 49.7 दिन का है।
And यदि आपका डेटा वास्तव में सदियों या सहस्राब्दी तक फैला है और अभी भी दूसरे या मिलीसेकंड के लिए सटीक है ... बधाई! तुम जो भी कर रहे हो, करते रहो।
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, ताकि जब मैं उस डेटा को