sql >> データベース >  >> Database Tools >> SSMS

TSQLクエリは、過去24時間の1時間ごとの値を返します

    あなたの問題は、期間を数時間に分割する必要があるということのようです。したがって、1日のすべての時間から始める必要があります。次に、オーバーラップを計算し、差を合計して(以下のミリ秒単位)、すべてを出力の時間に変換し直します。

    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
    

    また、これを機能させるには、「begin」と「end」を二重引用符または角かっこで囲む必要があります。これらはT-SQLの予約語です。そして、あなたは「...」を置き換える必要があります3〜22時間の追加行があります。



    1. Wampserverで古いバージョンのPHP/Apacheに変更した後、Phpmyadminアクセスが拒否されました

    2. 一時テーブルを作成した後、テーブルが存在しません

    3. PHPMyAdminアラートボックス-フォームに値がありません-通常のフィールドはすべて入力されていますか?

    4. MySQLストアド関数の適切なif句の構文は何ですか?