Групповой запрос mysql на 15 минут для всех дней. Ведра должны начинаться с HH: 00, HH: 15, HH: 30 и HH: 45 [дублировать]

is_array($detect) && empty($detect);

is_array

24
задан gsiener 8 May 2010 в 13:13
поделиться

7 ответов

SELECT   FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM     table
GROUP BY timekey;
45
ответ дан unutbu 21 August 2018 в 17:51
поделиться
  • 1
    Разве это не должно быть UNIX_TIMESTAMP(timestamp)/(15 * 60) минут? – Alexander Gladysh 8 May 2010 в 13:25
  • 2
    Да, спасибо за исправление @Alexander и @nickf. – unutbu 8 May 2010 в 14:02
  • 3
    Я не думаю, что ROUND - это правильная функция, которую следует использовать здесь. DIV более уместен. UNIX_TIMESTAMP(timestamp) DIV (15 * 60) Поскольку SELECT ROUND (1.8), ROUND (2.1) будут попадать в один и тот же сегмент, хотя они не должны. Ссылка: stackoverflow.com/a/3086470/412786 – tzzzoz 19 November 2015 в 16:47
  • 4
    ROUND дает другой 15-минутный интервал, чем DIV, но оба производят 15-минутные интервалы. – unutbu 19 November 2015 в 18:32
  • 5
    Я думаю, что использование FLOOR даст лучший результат, чем функция ROUND: 00:00:00 будет сгруппирована со значениями до 00:14:59. Я думаю, что это более естественная концепция. – kmas 15 November 2017 в 15:07

Попробуйте это, группируя записи с интервалом в 15 минут, вы можете изменить 15 * 60 на интервал в секундах, в котором вы нуждаетесь

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
10
ответ дан BenG 21 August 2018 в 17:51
поделиться
  • 1
    Мне нравится этот подход больше всего, потому что он удерживает минутный интервал как один из столбцов, делая его более читаемым. Благодарю. – MrB 30 September 2012 в 19:29
  • 2
    Это также помогло мне! Благодарю. Нужно было это часами, поэтому я изменил (15 * 60) на (60 * 60) – plocks 18 June 2015 в 10:02
  • 3
    Это не работает, если записи содержат несколько дат, потому что тогда все записи с одинаковым временем по датам группируются. – hepabolu 7 May 2017 в 17:46

Это сработало для меня

mysql> **SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60));**
+---------------------------------------------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60)) |
+---------------------------------------------------------------------+
| 2012-02-09 11:15:00                                                 |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
0
ответ дан Brian Webster 21 August 2018 в 17:51
поделиться

Я начал с ответа, приведенного выше, на unutbu, но не получил то, что мне было нужно, и ему пришлось добавить немного.

Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime

Этот код делится на 900 секунд в 15-минутном промежутке, затем выравнивает значение и умножает его на 900, по существу округляя до ближайшего 15-минутного прироста ,

4
ответ дан James 21 August 2018 в 17:51
поделиться

Адаптация подхода 1) ниже:

select Round(date_format(date, "%i") / (15*60)) AS interval  
from table
group by interval 

Адаптация подхода 3) ниже:

SELECT Round(Convert(substring(date_column, 14, 2), UNSIGNED) / (15*60)) AS interval /* e.g. 2009-01-04 12:20:00 */
FROM table 
GROUP BY interval;

Несколько подходов, которые я нашел здесь здесь :

1)

select date_format(date, "%W") AS `Day of the week`, sum(cost)
from daily_cost
group by `Day of the week` 
order by date_format(date, "%w")

2)

select count(*) as 'count', 
  date_format(min(added_on), '%Y-%M-%d') as 'week commencing',
  date_format(added_on, '%Y%u') as 'week' 
from system 
where added_on >= '2007-05-16' 
group by week 
order by 3 desc;

3)

SELECT substring(postdate, 1,10) AS dd, COUNT(id) FROM MyTable GROUP BY dd;

(Также здесь: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/ )

EDIT: все решения будут плохо работать на столе с большим количеством записей.

4
ответ дан Martin Vseticka 21 August 2018 в 17:51
поделиться
  • 1
    хорошо - как бы вы адаптировали их к группе на 15-минутные диапазоны? – nickf 8 May 2010 в 13:31
  • 2
    Точно так же, как ~ unutbu. Но он был быстрее :-) – Martin Vseticka 8 May 2010 в 13:46

После строк групп запросов и создания временных меток с интервалом 15 минут.

Select concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new 

Например, отметки времени 2016-11-09 13:16:29 2016-11-09 13:16:49 2016-11 -09 13:17:06 2016-11-09 13:17:26 2016-11-09 13:18:24 2016-11-09 13:19:59 2016-11-09 13:21:17

Сгруппированы в 2016-11-09 13:30:00

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60))) Верхняя граница времени до ближайшего 15-минутного интервала. например, 12:10 -> 12:15
  2. concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60))) Создает временную метку, берущую дату из поля метки времени.
2
ответ дан Vineeta Khatuja 21 August 2018 в 17:51
поделиться
1
ответ дан Salman A 1 November 2018 в 10:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: