sql >> Databáze >  >> RDS >> Mysql

Seskupení data a času MySQL do intervalů bez ohledu na časové pásmo

Můžete použít TIMESTAMPDIFF seskupit podle časových intervalů:

Pro zadaný interval hodin můžete použít:

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

Nahradit výskyty 2012-08-03 00:00:00 s vaším minimálním datem zadání.

<n> je váš zadaný interval v hodinách (každé 2 hodiny, 3 hodiny atd.) a totéž můžete dělat po dobu minut:

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

Kde <n> je váš zadaný interval v minutách (každých 45 minut, 90 minut atd.).

Ujistěte se, že zadáváte minimální vstupní datum (v tomto příkladu 2012-08-03 00:00:00 ) jako druhý parametr k TIMESTAMPDIFF .

UPRAVIT: Pokud se nechcete starat o to, jakou intervalovou jednotku vybrat v TIMESTAMPDIFF funkci, pak samozřejmě stačí provést interval po sekundách (300 =5 minut, 3600 =1 hodina, 7200 =2 hodiny atd.)

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

EDITACE 2: Chcete-li reagovat na vaši poznámku týkající se snížení počtu oblastí v prohlášení, kde musíte zadat minimální datum parametru, můžete použít:

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

A jednoduše zadejte svůj minimální parametr datetime jednou do dílčího výběru spojení.

Můžete dokonce vytvořit druhý sloupec v dílčím výběru spojení pro váš sekundový interval (např. 3600 ) a sloupec pojmenujte jako secinterval ... pak změňte <n> 's na b.secinterval , takže svůj minimální parametr data AND interval musíte zadat pouze jednou.

Ukázka SQLFiddle



  1. NOT IN výběr s hodnotami NULL

  2. Oracle:Existuje způsob, jak získat nedávné chyby syntaxe SQL?

  3. 3 způsoby použití VŠECHNY na serveru SQL

  4. sql jdbc getgeneratedkeys vrátí id sloupce nenalezeno, typ sloupce neznámý