Mysql
 sql >> база данни >  >> RDS >> Mysql

Групиране на MySQL datetime в интервали, независимо от часовата зона

Можете да използвате TIMESTAMPDIFF за групиране по интервали от време:

За определен интервал от часове можете да използвате:

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

Заменете поява на 2012-08-03 00:00:00 с минималната ви дата на въвеждане.

<n> е посоченият от вас интервал в часове (всеки 2 часа, 3 часове и т.н.) и можете да направите същото за минути:

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

Където <n> е посоченият от вас интервал в минути (всеки 45 минути, 90 минути и т.н.).

Уверете се, че подавате минималната си дата за въвеждане (в този пример 2012-08-03 00:00:00 ) като втори параметър за TIMESTAMPDIFF .

РЕДАКТИРАНЕ: Ако не искате да се притеснявате коя интервална единица да изберете в TIMESTAMPDIFF функция, след което разбира се просто направете интервала по секунди (300 =5 минути, 3600 =1 час, 7200 =2 часа и т.н.)

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

РЕДАКТИРАНЕ 2: За да адресирате коментара си, отнасящ се до намаляване на броя на областите в изявлението, където трябва да предадете датата на минималния си параметър, можете да използвате:

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

И просто предайте своя минимален параметър за дата и час веднъж в подизбора за присъединяване.

Можете дори да направите втора колона в подизбора за присъединяване за вашия интервал от секунди (напр. 3600 ) и именувайте колоната нещо като secinterval ... след това променете <n> 's към b.secinterval , така че трябва да предавате своя параметър за минимална дата И интервал по веднъж.

SQLPiddle Демо



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL - Как да заобиколите ограничението за размера на реда от 66 KB

  2. Може ли една съхранена процедура/функция да върне таблица?

  3. не може да се свърже с mysql база данни в Ubuntu

  4. вмъкнете XML данни в mysql с php

  5. Наблюдавайте MySQL вмъквания от различни приложения