簡體   English   中英

每30分鍾對時間戳進行分組

[英]Grouping timestamp every 30 minutes

我試圖每30分鍾對我的時間戳進行分組。

我希望我的結果是這樣的:

2016-03-09 00:00:00
2016-03-09 00:30:00
2016-03-09 01:00:00

相反,我的結果如下:

2016-03-09 00:00:23
2016-03-09 00:35:02
2016-03-09 01:00:03

我正在使用的查詢就是這個

SELECT timestamp
FROM a.tablename
WHERE name = 'example' AND timestamp LIKE '2016-03-09%'
GROUP BY ROUND(((60/30) * HOUR(timestamp) + FLOOR( MINUTE(timestamp) / 30)));

我怎樣才能得到我想要的結果? 我已經研究了關於SO的其他答案,而非答案的幫助

這是30分鍾間隔分組的基本查詢。

SELECT 
FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60)) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60));

注意: ROUND()可能會導致輸出錯誤。 請改用以下查詢。 請看以下示例:

SELECT ROUND(3.7), ROUND(4.2);

結果: 4 4

兩者都在同一部分。 對於上述查詢也是如此,而舍入不同段的timestamp可能落在同一段中,從而導致錯誤的輸出

[推薦以下查詢]

SELECT 
FROM_UNIXTIME((UNIX_TIMESTAMP(`timestamp`) DIV (30* 60) ) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY UNIX_TIMESTAMP(`timestamp`) DIV (30* 60)

SQL FIDDLE DEMO


或者,您可以采用以下查詢。

SELECT 
FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60)) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY ( 4 * HOUR( `timestamp` ) + FLOOR( MINUTE( `timestamp` ) / 30 ));

Relatedpost

一種方法是使用to_seconds() ,截斷值,然后重新創建datetime值:

select date_add(0, interval floor(to_seconds(timestamp) / (30 * 60)) second) as timestamp
from a.tablename
where name = 'example' and timestamp >= '2016-03-09' and timestamp < '2016-03-10'
group by date_add(0, interval floor(to_seconds(timestamp) / (30 * 60)) second)
order by 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM