2010-05-08 3 views

Odpowiedz

41
SELECT FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey 
FROM  table 
GROUP BY timekey; 
+3

Czy nie powinien to być "UNIX_TIMESTAMP (znacznik czasu)/(15 * 60)" przez kilka minut? –

+1

Tak, dzięki za korektę @Alexander i @nickf. – unutbu

+2

Nie uważam, że funkcja ROUND jest właściwa. DIV jest bardziej odpowiednie. 'UNIX_TIMESTAMP (znacznik czasu) DIV (15 * 60)' Ponieważ SELECT ROUND (1,8), ROUND (2.1) spadnie w tym samym segmencie, chociaż nie powinny. Ref: http://stackoverflow.com/a/3086470/412786 – tzzzoz

4

Adaptacja podejścia 1) poniżej:

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

Adaptacji podejściu 3) poniżej:

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; 

Kilka podejść Znalazłem here:

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; 

(także tutaj: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/)

EDIT: Wszystkie rozwiązania będą wykonywać źle na stole z dużą liczbą rekordów.

+0

cóż - w jaki sposób dostosowałbyś je do grupy o 15 minut? – nickf

+0

Tak samo jak ~ unutbu. Ale był szybszy :-) –

8

Spróbuj tego, grupowanie zapisów 15 minut odstępu, można zmienić 15 * 60 do przedziału w sekundach trzeba

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename 
group by intervals 
+0

Najbardziej podoba mi się to podejście, ponieważ zachowuje interwał minutowy jako jedną z kolumn, czyniąc go bardziej czytelnym. Dzięki. – MrB

+0

Pomogło mi to również! Dzięki. Potrzebowałem go godzinami, więc zmieniłem (15 * 60) na (60 * 60) – plocks

+0

To nie działa, jeśli rekordy zawierają wiele dat, ponieważ wtedy wszystkie rekordy o tym samym czasie w różnych datach są pogrupowane. – hepabolu

0

Ten pracował dla mnie

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

Zacząłem odpowiedź podana powyżej przez unutbu, ale nie dostałem tego, czego potrzebowałem i musiałem dodać trochę do tego.

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

Kod ten dzieli się przez 900 sekund w przedziale 15 minut a następnie podłogi wartość i mnoży się przez 900 do tyłu, w zasadzie zaokrąglone w dół do najbliższej 15 minut wartość.

2

Następujące wiersze grup zapytań i tworzy znaczniki czasu w odstępach 15-minutowych.

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 


E.g Sygnatury
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

są pogrupowane w 2016 roku -11-09 13:30:00

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    górnej granicy czasu do najbliższego 15 min odstępach czasowych. np 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)))
    Generuje timestamp biorąc datę z pola datownika.