虽然 Teradata 支持TIME
数据类型,但建议使用TIMESTAMP WITH TIME ZONE
或TIMESTAMP
(隐含时区)。这是一个使用TIMESTAMP
数据类型和EXPAND ON
CREATE VOLATILE TABLE example (
id INTEGER NOT NULL, str_time TIMESTAMP(0) NOT NULL, end_time TIMESTAMP(0) NOT NULL)
PRIMARY INDEX(id) on commit preserve rows;
INSERT example VALUES(1,'2020-01-07 10:00:00','2020-01-07 18:00:00');
INSERT example VALUES(2,'2020-01-07 09:00:00','2020-01-07 18:00:00');
INSERT example VALUES(3,'2020-01-07 17:15:00','2020-01-08 03:45:00');
SELECT id, str_time, end_time, BEGIN(pd) AS bucket_str, END(pd) AS bucket_end,
CAST((LEAST(END(pd),end_time) - GREATEST(BEGIN(pd),str_time) MINUTE) AS DECIMAL(4,2))/60 AS worked_hours
FROM
(SELECT id, str_time, end_time, pd
FROM example
EXPAND ON PERIOD(str_time,end_time) pd
BY ANCHOR PERIOD ANCHOR_HOUR -- Expand to multiple rows starting/ending on the hour
) AS xpand
ORDER BY id, bucket_str;
添加额外的列和 ORDER BY 只是为了帮助澄清流程,可以省略。