2017-06-20 11 views
1

私がどのように見えるのテーブルがあります。ムービーの開始時間と終了時間が含まれているテーブルを使用している場合、1時間ごとに監視されているムービーの数をカウントするにはどうすればよいですか?

start_timestamp  end_timestamp 
2012-11-18 05:53:36.0 2012-11-18 7:46:40.0 
2012-11-18 06:34:23.0 2012-12-18 09:21:57.0 

をそして、私は、出力は次のようになりたい:

hour     moves_being_played 
2012-11-18 05:00:00.0 1 
2012-11-18 06:00:00.0 2 
2012-11-18 07:00:00.0 2 
2012-11-18 08:00:00.0 1 
2012-11-18 09:00:00.0 1 

これまでのところ、私は手動で各時間の値を設定し、数を数えてみました開始時間が短く、終了時間が長い映画の

SELECT 
COUNT(CASE WHEN HOUR(start_time) < 6 THEN 1 ELSE null END) 
COUNT(CASE WHEN HOUR(start_time) < 7 THEN 1 ELSE null END) - COUNT(CASE WHEN HOUR(end_time) < 7 THEN 1 ELSE null END) 
... 
COUNT(CASE WHEN HOUR(start_time) < 9 THEN 1 ELSE null END) - COUNT(CASE WHEN HOUR(end_time) < 9 THEN 1 ELSE null END) 
FROM table 

手動で各時間帯を設定せずに結果を「ワイド」表ではなく「長い」表にすることはできますか?

+0

は、DBプラットフォームにタグを付けてください映画のテーブルで結果を結合し、あなたは何を試してみましたか? – OldProgrammer

+0

ホエイ彼らは "あなたは何を試しましたか"と言うと、あなたが質問で試したACTUALコードを貼り付けることを意味します... – ganders

+1

これはSQL Server向けの記事ですが、あなたの問題のためのいくつかのアイデアを与えることができます。 http://www.kodyaz.com/t-sql/create-date-time-intervals-table-in-sql-server.aspx – Jeremy

答えて

0

私のアプローチは、次のようになります。

iは再帰的にその日のすべての完全な時間を生成し、

with mycte as 
(
    SELECT CAST('00:00:00' as time) AS MyHour 
    UNION ALL 
    SELECT DATEADD(HOUR, 1, MyHour) 
    FROM mycte 
    WHERE MyHour < '23:00:00' 
) 
SELECT COUNT(*) AS movies_being_played 
     ,CONVERT(DATETIME, CONVERT(CHAR(8), yourmovietable.start_timestamp, 112) + ' ' + CONVERT(CHAR(8), mycte.MyHour, 108)) 
    FROM mycte 
    INNER JOIN yourmovietable 
    ON mycte.MyHour BETWEEN CAST(yourmovietable.start_timestamp as time) 
         AND CAST(yourmovietable.end_timestamp as time)     
GROUP BY CONVERT(DATETIME, CONVERT(CHAR(8), yourmovietable.start_timestamp, 112) + ' ' + CONVERT(CHAR(8), mycte.MyHour, 108))      
関連する問題