2010-04-05 7 views
17

Jak policzyć liczbę rekordów w tabeli MySQL w oparciu o kolumnę znacznika czasu na jednostkę czasu, w której jednostka czasu jest dowolna?Dane MySQL grupowego do arbitralnie zmienionych przedziałów czasowych

W szczególności chcę policzyć, ile znaczników czasu rekordu spadło do 15-minutowych segmentów w danym przedziale. Rozumiem, jak to zrobić w wiadrach 1 sekunda, 1 minuta, 1 godzina, 1 dzień itp. Przy użyciu funkcji daty MySQL, np.

SELECT YEAR(datefield) Y, MONTH(datefield) M, DAY(datefield) D, COUNT(*) Cnt FROM mytable GROUP BY YEAR(datefield), MONTH(datefield), DAY(datefield) 

ale w jaki sposób mogę pogrupować według 15-minutowych wiaderek?

Odpowiedz

21
GROUP BY 
    YEAR(datefield), 
    MONTH(datefield), 
    DAY(datefield), 
    HOUR(datefield), 
    FLOOR(MINUTE(datefield)/15) 

Można alternatywnie powiedzieć po prostu:

SELECT FLOOR(UNIX_TIMESTAMP(datefield)/900) AS t, COUNT(*) AS cnt 
FROM mytable 
GROUP BY t 

z aplikacją odpowiedzialną za formatowanie znacznika czasu dla każdego okresu 15 minut z powrotem do czytelnej Y/M/D/H/M. (Jeśli potrzebne, aby mieć czas lokalny w szalonej niż ćwierć godziny wyrównanym strefy czasowej, którą trzeba hack offsetu choć.)

4

Co powiemy na uzyskanie INTEGER (HOUR (DateField) * 60 + MINUTES (DateField))/YourInterval.

W ten sposób, bez względu na interwał, włączając godzinę * 60 minut, będzie on przechowywany sekwencyjnie w ciągu danego dnia, a użytkownik nie będzie miał do czynienia z zaledwie 15 minutami zgrupowanymi w ciągu godziny, ale co 15 minut swojego WŁASNEGO godzina ... Dodaj tę kolumnę do grupy przez klauzulę, którą możesz zrobić po pozycji porządkowej.

3

Wystarczy dostać myślisz, tu jest alternatywą dla rozwiązania FLOOR(MINUTE(datefield)/15):

GROUP BY CASE 
WHEN MINUTES(datetime) BETWEEN 0 AND 14 THEN 0 
WHEN MINUTES(datetime) BETWEEN 15 AND 29 THEN 1 
WHEN MINUTES(datetime) BETWEEN 30 AND 44 THEN 2 
WHEN MINUTES(datetime) BETWEEN 45 AND 59 THEN 3 
END 
+0

@ Marcus: W jaki sposób wynik różni się od użycia FLOOR? –

+1

@Eric J., wynik jest taki sam. To kolejny sposób na zrobienie tego. –

+0

Posiadałem wiele liczb całkowitych typu unixtime. Używając tego, mogłem ustawić "time buckets" w kodzie (odstępy miesięczne, więc nie wszystkie interwały są równe). – Martijn