我想找出每个 id
的两个时间戳之间的时间差。
计算时只需要计算上午9点到下午17点和工作日。
例如对于第一条记录,必须从 2021-05-19 的 9am 开始计算,因此结果为 45 分钟。 对于第二个记录,它将是 330 分钟,计算如下:
TIMESTAMPDIFF('minute', '2021-05-19 15:30:00'::timestamp, '2021-05-19 17:00:00'::timestamp) +
TIMESTAMPDIFF('minute', '2021-05-20 09:00:00'::timestamp, '2021-05-20 13:00:00'::timestamp)
以下是示例数据:
WITH t1 AS (
SELECT 'A' AS id, '2021-05-18 18:30:00'::timestamp AS started_at, '2021-05-19 09:45:00'::timestamp AS ended_at UNION ALL
SELECT 'B' AS id, '2021-05-19 15:30:00'::timestamp AS started_at, '2021-05-20 13:00:00'::timestamp AS ended_at
)
SELECT *
FROM t1
答案 0 :(得分:0)
您可以使用以下 UDF
create or replace function tsrange_intersection(s string, e string)
RETURNS double
LANGUAGE JAVASCRIPT
AS
$$
let minutes = 0
start = new Date(S)
end = new Date(E)
let t = start
while(t < end) {
if ([1, 2, 3, 4, 5].includes(t.getDay())
&& [9, 10, 11, 12, 13, 14, 15, 16].includes(t.getHours())) {
minutes += 1
}
t = new Date(t.getTime() + 60*1000);
}
return minutes
$$;
其工作原理如下:
WITH t1 AS (
SELECT 'A' AS id, '2021-05-18 18:30:00' AS started_at, '2021-05-19 09:45:00' AS ended_at UNION ALL
SELECT 'B' AS id, '2021-05-19 15:30:00' AS started_at, '2021-05-20 13:00:00' AS ended_at
)
SELECT tsrange_intersection(started_at, ended_at) minutes
FROM t1;
MINUTES
45
330