आपकी समस्या यह प्रतीत होती है कि समय अवधि को घंटों में विभाजित करने की आवश्यकता है। इसलिए, आपको दिन के सभी घंटों से शुरुआत करनी होगी। फिर आप ओवरलैप की गणना करते हैं, अंतरों (मिलीसेकंड में नीचे) का योग करते हैं और आउटपुट के लिए सब कुछ वापस एक समय में परिवर्तित करते हैं।
with const as (
select dateadd(hour, 1, cast(cast(getdate() -1 as date) as datetime)) as midnight
),
allhours as (
select 0 as hour, midnight as timestart, dateadd(hour, 1, midnight) as timeend from const union all
select 1 as hour, dateadd(hour, 1, midnight), dateadd(hour, 2, midnight) from const union all
select 2 as hour, dateadd(hour, 2, midnight), dateadd(hour, 3, midnight) from const union all
. . .
select 23 as hour, dateadd(hour, 23, midnight), dateadd(hour, 24, midnight) from const
)
select ah.hour,
sum(datediff(ms, (case when ah.timestart >= dt.begin then timestart else dt.begin end),
(case when ah.timeend <= dt.end then ah.timeend else dt.end end)
)
) as totalms,
cast(dateadd(ms, sum(datediff(ms, (case when ah.timestart >= dt.begin then timestart else dt.begin end),
(case when ah.timeend <= dt.end then ah.timeend else dt.end end)
)
),
0) as time
) as totalTime
from allhours ah left outer join
DeviceTable dt
on ah.timestart< coalesce(dt.end, getdate()) and
ah.timeend >= dt.begin
group by ah.hour
order by ah.hour
साथ ही, इस कार्य को करने के लिए, आपको "प्रारंभ" और "अंत" को दोहरे उद्धरण चिह्नों या वर्ग कोष्ठकों में लपेटना होगा। ये टी-एसक्यूएल में आरक्षित शब्द हैं। और आपको "..." को प्रतिस्थापित करने की आवश्यकता है। 3 से 22 घंटों के लिए अतिरिक्त लाइनों के साथ।