2015-09-01 65 views
1

我對SQL不太熟練,所以希望這裏有人能幫助我。試圖從SQL中獲取24小時的數據

我在我的表中有一個date_of_post列,看起來像這樣(示例)2015-08-31 11:00:00

我使用INTERVAL 1 DAY獲得最後24小時。然而,它的回報似乎超過了過去24小時。這是我使用來獲取我的數據

SELECT DATE_ADD(date(t.date_of_post), 
     INTERVAL hour(t.date_of_post) HOUR) AS dateTime, 
     count(*) as entries 
FROM `soc_stat` t 
WHERE `main_tag` = 'morgenmad' 
    AND t.date_of_post > DATE_SUB(CURDATE(), INTERVAL 1 DAY) 
GROUP BY date(t.date_of_post), hour(t.date_of_post) 

查詢並返回以下:

2015-08-31 11:00:00 = 11 
2015-08-31 12:00:00 = 2 
2015-08-31 13:00:00 = 3 
2015-08-31 14:00:00 = 3 
2015-08-31 15:00:00 = 1 
2015-08-31 16:00:00 = 3 
2015-08-31 17:00:00 = 2 
2015-08-31 19:00:00 = 1 
2015-09-01 04:00:00 = 1 
2015-09-01 05:00:00 = 3 
2015-09-01 06:00:00 = 9 
2015-09-01 07:00:00 = 33 
2015-09-01 08:00:00 = 38 
2015-09-01 09:00:00 = 29 
2015-09-01 10:00:00 = 13 
2015-09-01 11:00:00 = 12 
2015-09-01 12:00:00 = 6 
2015-09-01 13:00:00 = 5 

我不明白爲什麼11:00:0012:00:0013:00:002015-08-312015-09-01存在。它不應該只返回最後24小時嗎?

+0

檢查你的mysql的時區。它可能會保留默認值而不是實際的時區。 –

+0

不匹配所選列和按列分組。 – jarlh

回答

1

CURDATE()返回「今天的開始」。將其替換爲NOW()

+0

非常感謝。 SQL讓我瘋狂!讚美Stackoverflow :-D –

+0

不客氣 – M0rtiis

1

視覺可能會有所幫助。如果你在別處使用別名。當您使用聚合函數(如count)時,按所有非聚合列進行分組。

for me it is 2015-09-01 08:47:00 

create table soc_stat 
( id int auto_increment primary key, 
    main_tag varchar(20) not null, 
    date_of_post datetime not null 
); 
truncate table soc_stat; 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-09-02 11:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-09-01 11:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-09-01 09:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-09-01 08:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-09-01 07:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-08-31 09:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-08-31 08:00:00'); 
insert soc_stat (main_tag,date_of_post) values ('morgenmad','2015-08-31 07:00:00'); 

SELECT date(t.date_of_post) dt, hour(t.date_of_post) hr,count(*) as entries 
FROM `soc_stat` t 
WHERE t.`main_tag` = 'morgenmad' 
AND t.date_of_post between DATE_SUB(now(), INTERVAL 1 DAY) and now() 
GROUP BY dt,hr 
order by t.date_of_post desc; 

+------------+------+---------+ 
| dt   | hr | entries | 
+------------+------+---------+ 
| 2015-09-01 | 8 |  1 | 
| 2015-09-01 | 7 |  1 | 
| 2015-08-31 | 9 |  1 | 
+------------+------+---------+ 
相關問題