sql >> Database >  >> Database Tools >> SSMS

TSQL-query retourneert waarden voor elk uur van de afgelopen 24 uur

Uw probleem lijkt te zijn dat de tijdspanne moet worden opgedeeld in uren. Je moet dus met alle uren van de dag beginnen. Vervolgens bereken je de overlap, tel je de verschillen op (hieronder in milliseconden) en reken je alles terug naar een tijd voor de output.

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

Om dit te laten werken, moet u "begin" en "eind" tussen dubbele aanhalingstekens of vierkante haken plaatsen. Dit zijn gereserveerde woorden in T-SQL. En je moet de ". . . " vervangen. met extra lijnen voor uren van 3 tot 22.



  1. SQL:tabellen met prefix verwijderen

  2. Nginx met phpmyadmin verkeerde omleiding na inloggen

  3. mysqli_query invoer via variabele

  4. Waar komen al die SQL Server-sessies vandaan?