2016-12-02 56 views
-1

我有這段代碼來計算每小時事件的發生次數。我設置它來計算locate_received_date爲2016-12-01(注意:locate_received_date數據類型爲DATETIME,帶有YYYY-MM-DD hh:mm:ss格式)的所有小時的計數。我手動輸入日期以計算前一天。代碼摘錄如下:統計所有日期(不是特定日期)的事件

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

我不確定爲什麼您發佈的查詢不適用於日期範圍跨越多個日期。從我看到的這個應該適用於任何日期範圍。 –

+0

我寫了「WHERE locate_received_date BETWEEN'2016-12-01 00:00:00.000'和'2016-12-01 23:59:59.999」,只寫了一天。我需要這個命令更通用,因此它可以運行數據庫中的所有日期。我在編輯我的問題的過程中添加我的表 –

回答

0

它只計算一天的原因是where子句指定了一天。如果您刪除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服務器的轉換代碼:https://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

嗨尤里!謝謝回覆。我的代碼不工作,因爲我無法將locate_received_date提供給SUBSTRING參數。它不需要日期數據類型 –

+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))