2015-09-01 2 views
1

Я не очень разбираюсь в SQL, поэтому, надеюсь, кто-то здесь может мне помочь.Попытка получить 24 часа данных из SQL

У меня столбец 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:00, 12:00:00 и 13:00:00 существуют в 2015-08-31 и 2015-09-01. Разве он не должен возвращать только последние 24 часа?

+0

Проверьте часовой пояс вашего mysql. Он может содержать значение по умолчанию вместо фактического часового пояса. –

+0

Несоответствие выбранным столбцам и группа по столбцам. – jarlh

ответ

1

CURDATE() возвращает «начало сегодняшнего дня». замените его на NOW()

+0

Большое спасибо. SQL приводит меня в орехи! Хвалите Stackoverflow :-D –

+0

Добро пожаловать – M0rtiis

1

Визуальный может помочь. Если вы используете псевдонимы с ними на всем протяжении. Когда вы используете агрегированные функции, такие как count, group всеми неагрегатными столбцами.

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 | 
+------------+------+---------+ 
Смежные вопросы