Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Grupowanie daty i godziny MySQL w interwały niezależnie od strefy czasowej

Możesz użyć TIMESTAMPDIFF grupować według przedziałów czasu:

Dla określonego przedziału godzin możesz użyć:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(HOUR, '2012-08-03 00:00:00', timestamp) / <n>) * <n> HOUR AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Zastąp wystąpienia 2012-08-03 00:00:00 z minimalną datą wprowadzenia.

jest określony przedział w godzinach (co 2 godziny, 3 godzin itp.) i możesz zrobić to samo przez minuty:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(MINUTE, '2012-08-03 00:00:00', timestamp) / <n>) * <n> MINUTE AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Gdzie jest określony przedział w minutach (co 45 minuty, 90 minut itp.).

Upewnij się, że podajesz minimalną datę wprowadzenia (w tym przykładzie 2012-08-03 00:00:00 ) jako drugi parametr TIMESTAMPDIFF .

EDYTUJ: Jeśli nie chcesz się martwić, którą jednostkę interwału wybrać w TIMESTAMPDIFF funkcji, to oczywiście po prostu wykonaj interwał w sekundach (300 =5 minut, 3600 =1 godzina, 7200 =2 godziny itd.)

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, '2012-08-03 00:00:00', timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

EDIT2: Aby zaadresować swój komentarz dotyczący zmniejszenia liczby obszarów w wyciągu, w których musisz przekazać swoją minimalną datę parametru, możesz użyć:

SELECT   b.mindate + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, b.mindate, timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
JOIN     (SELECT '2012-08-03 00:00:00' AS mindate) b ON timestamp >= b.mindate
GROUP BY start_time

I po prostu przekaż swój parametr minimalnej daty i godziny do podselekcji sprzężenia.

Możesz nawet utworzyć drugą kolumnę w podselekcji łączenia dla swojego interwału sekund (np. 3600 ) i nazwij kolumnę mniej więcej w stylu secinterval ... następnie zmień s do b.secinterval , więc wystarczy podać parametr minimalnej daty ORAZ interwał raz za każdym razem.

Pokaz SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mapowanie Doctrine 2 odwołujące się do unikalnego klucza

  2. Najlepsza praktyka / standard przechowywania adresu w bazie danych SQL

  3. MySQL łączy dwie kolumny i dodaje do nowej kolumny

  4. Grupowanie MySQL według tygodnia na podstawie kolumny daty?

  5. Jak poprawić szybkość zapisów InnoDB na sekundę w bazie danych MySQL?