雪花中的时间戳差异

时间:2021-05-21 11:24:30

标签: sql date time-series snowflake-cloud-data-platform date-range

我想找出每个 id 的两个时间戳之间的时间差。 计算时只需要计算上午9点下午17点工作日

enter image description here

例如对于第一条记录,必须从 2021-05-199am 开始计算,因此结果为 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

1 个答案:

答案 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