【问题标题】:Timestamp difference in Snowflake雪花中的时间戳差异
【发布时间】:2021-08-10 14:58:28
【问题描述】:

我想找出每个id 的两个时间戳之间的时间差。 计算时,只需要计算9am 到 17pm和工作日。

例如第一条记录必须从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

【问题讨论】:

  • 您想如何处理部分时间?如果你的创建时间是 16:15,而你的完成时间是第二天 09:45,结果应该是什么,为什么?您可能需要编写一个函数,该函数将遍历开始日期和结束日期之间的所有时间,并应用逻辑是否将该时间包括在您的总计数中
  • @NickW 为了简单起见,我只是在 TIMESTAMPDIFF 中使用了小时。对于部分小时,我会改用分钟。我使用 tstzrange 在 Postgres 中创建营业时间范围。 Snowflake中是否有类似的功能?该解决方案从这里开始工作。 stackoverflow.com/questions/67194137/…

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


【解决方案1】:

你可以使用下面的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2015-06-27
    • 2021-08-12
    相关资源
    最近更新 更多