Sql 如何在vertica中将时间戳数据存储到自定义宽度为n小时的存储桶中

Sql 如何在vertica中将时间戳数据存储到自定义宽度为n小时的存储桶中,sql,time-series,vertica,Sql,Time Series,Vertica,我有一个表,其中包含一个列Start_Timestamp,该列具有类似2020-06-02 21:08:37的时间戳值。我想创建一个新的专栏,它将这些时间戳分类为6小时 例如 输入: 开始时间戳 2020-06-02 21:08:37 2020-07-19 01:23:40 2021-11-13 12:08:37 您只需提取小时数并进行一些算术运算: select t.*, floor(extract(hour from start_timestamp) / 6) * 6 as b

我有一个表,其中包含一个列Start_Timestamp,该列具有类似2020-06-02 21:08:37的时间戳值。我想创建一个新的专栏,它将这些时间戳分类为6小时

例如

输入:

开始时间戳 2020-06-02 21:08:37 2020-07-19 01:23:40 2021-11-13 12:08:37
您只需提取小时数并进行一些算术运算:

select t.*,
       floor(extract(hour from start_timestamp) / 6) * 6 as bin
from t;

注:这以最早的一小时表示垃圾箱的特征。这似乎比字符串表示更有用,但如果您真的愿意,可以构造字符串。

这是Vertica。使用
时间片()
函数。然后,将其与Vertica与Oracle共享的
TO_CHAR()
函数结合使用

当表达式将00:00更改为24:00时,您始终可以添加一个
大小写,但由于这不是标准,我甚至不想麻烦

WITH
indata(start_ts) AS (
          SELECT TIMESTAMP '2020-06-02 21:08:37'
UNION ALL SELECT TIMESTAMP '2020-07-19 01:23:40'
UNION ALL SELECT TIMESTAMP '2021-11-13 12:08:37'
)
SELECT 
  TIME_SLICE(start_ts,6,'HOUR') 
  AS tm_slice
,   TO_CHAR(TIME_SLICE(start_ts,6,'HOUR'),'HH24:MIH - ')
  ||TO_CHAR(TIME_SLICE(start_ts,6,'HOUR','END'),'HH24:MIH') 
  AS caption
, start_ts
FROM indata;
-- out       tm_slice       |     caption     |      start_ts       
-- out ---------------------+-----------------+---------------------
-- out  2020-06-02 18:00:00 | 18:00H - 00:00H | 2020-06-02 21:08:37
-- out  2020-07-19 00:00:00 | 00:00H - 06:00H | 2020-07-19 01:23:40
-- out  2021-11-13 12:00:00 | 12:00H - 18:00H | 2021-11-13 12:08:37
“00H-07H”如何成为“六”小时的垃圾箱?