2016-12-02 5 views
-1

私はこのコードを使用して、一連のイベントの発生回数を1時間ごとにカウントします。私は、locate_received_dateが2016-12-01(注:locate_received_dateデータ型はYYYY-MM-DD hh:mm:ss形式のDATETIME)のすべての時間のカウントを計算するように設定しました。私は、前日のカウントを手動で入力しました。コードの抜粋は次のとおりです。すべての日付(特定の日付ではない)に発生をカウントする

SELECT CAST(locate_received_date as date) AS 'ForDate', 
     DATEPART(hh, locate_received_date) AS 'OnHour', 
     COUNT (*) AS 'HourCount' 
FROM MyTable 
WHERE locate_received_date BETWEEN '2016-12-01 00:00:00.000' AND '2016-12-01 23:59:59.999' 
GROUP BY CAST(locate_received_date as date), DATEPART(hh, locate_received_date); 

テーブル「MyTable」には、さまざまな日付のデータが数百行あります。手動で入力したものだけでなく、すべての異なる日付のカウントを実行する必要があります。

DISTINCT CAST(locate_received_date AS DATE) 

これはおそらく何らかのFORループを使って行うのですか?

編集: テーブルを作成するスクリプトは次のとおりです。実際に作成する価値のあるコラムはありません。テーブルにIDや何もありません。テーブルが更新されており、更新があるたびに、locate_received_dateは発生日時で更新されます。私は時間に基づいて最初に数える必要があります(私のスクリプトがします)、そしてまた日に基づいています。

CREATE Table myTable(
    Locate_Received_Date date); 


INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-01 15:14:07.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-01 15:13:37.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-02 15:13:37.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-01 15:13:07.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-02 15:12:08.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-02 15:12:07.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-11-28 15:11:37.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-02 15:11:08.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-12-02 15:11:07.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-11-28 15:10:37.000'); 
INSERT INTO myTable(Locate_Received_Date) VALUES ('2016-11-29 15:10:08.000'); 

助けてください。ありがとう

+0

ここから始めるのがいいです。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+1

あなたが投稿した質問が1つ以上の日付にまたがる日付範囲。私の見ているところから、これはほぼすべての日付範囲で機能するはずです。 –

+0

私は「where locate_received_date BETWEEN '2016-12-01 00:00:00.000' AND '2016-12-01 23:59:59.999」と書いており、1日しか指定していません。このコマンドはより一般的なものにする必要があるので、データベース内のすべての日付に対して実行できます。私は自分のテーブルを追加するために私の質問を編集中です –

答えて

0

1日だけカウントする理由は、where節が1日指定されているためです。 where句を削除してorder byを追加すると、あなたが探しているものを達成できると思います。

SELECT CAST(locate_received_date as date) AS 'ForDate', 
     DATEPART(hh, locate_received_date) AS 'OnHour', 
     COUNT (*) AS 'HourCount' 
FROM MyTable 
GROUP BY CAST(locate_received_date as date), DATEPART(hh, locate_received_date) 
ORDER BY CAST(locate_received_date as date), DATEPART(hh, locate_received_date); 
+0

ありがとう!これは私のために働いた –

0

時間単位で特定の日の発生をカウントする必要があるのは間違いありませんか?もしそうなら、ここに合成例です。

あなたのデータに適用
with a as (select convert(datetime,'2016-12-01 00:01:00.000',120) s 
     union all 
     select convert(datetime,'2016-12-01 01:02:02.000',120) s 
     union all 
     select convert(datetime,'2016-12-01 00:03:03.000',120) s 
     union all 
     select convert(datetime,'2016-12-01 03:04:04.000',120) s 
     union all 
     select convert(datetime,'2016-12-01 00:05:05.000',120) s 
     union all 
     select convert(datetime,'2016-12-01 06:00:00.010',120) s) 
     , 
    b as(select convert(varchar(10), s,120) s 
     , a.s dt 
     , DATEPART(hh,s)onhour 
      from a) 
select count(*)cnt, s, onhour 
    from b 
group by s, onhour 

それは次のようになります。

with a as (select convert(varchar(10), locate_received_date,120)s 
      , locate_received_date 
      , DATEPART(hh,locate_received_date)onhour 
      from MyTable  
      ) 
select count(*)cnt, s, onhour 
    from a 
group by s, onhour 

あなたは覚えておく必要があります主なものは、これに応じてMS SQL Serverの変換コードです:https://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

こんにちはYuriy!返信いただきありがとうございます。 SUBSTRING引数にlocate_received_dateを供給できないため、私のコードが動作していません。日付データ型を取得しません –

+0

私は自分の投稿を変更しました。一般的に日付を文字列に変換したり、文字列を日付に変換することは、どちらの側にとってもあまり重要ではありません –

0

あなたlocate_received_dateは右、日時、ない日です。ご希望の出力は、これはレンダリングするものとは異なり、私はそれに応じてクエリを更新することができる場合、私に教えてください?もしそうなら、このようなものはうまくいくはずです:

select count(Locate_Received_Date) from myTable 
group by 
convert(varchar(10), cast(Locate_Received_Date as date), 112) + '_' +  
convert(varchar(2), DATEPART(hh, Locate_Received_Date)) 
関連する問題