雪花中两个日期之间的工作时间

Posted

技术标签:

【中文标题】雪花中两个日期之间的工作时间【英文标题】:Working hours between two dates in Snowflake 【发布时间】:2021-06-20 11:45:52 【问题描述】:

如何在不创建表格的情况下计算? 我已经尝试过(datediff)和时间戳之类的功能,但我无法找到解决方案

我想得到这样的东西

+---------------------+---------------------+---------------+
|       create_Task   |        Solved_Task  | BusinessHours |
+---------------------+---------------------+---------------+
| 2012-03-05 09:00:00 | 2012-03-05 15:00:00 |  6.000000     |
| 2012-03-05 10:00:00 | 2012-03-06 10:00:00 |  8.000000     |
| 2012-03-05 11:00:00 | 2012-03-06 10:00:00 |  7.000000     |
| 2012-03-05 10:00:00 | 2012-03-06 15:00:00 | 13.000000     |
| 2012-03-09 16:00:00 | 2012-03-12 10:00:00 |  2.000000     |
| 2012-03-06 16:00:00 | 2012-03-15 10:00:00 | 50.000000     |
| 2012-03-09 16:00:00 | 2012-03-19 10:00:00 | 42.000000     |
+---------------------+---------------------+---------------+

我想指定工作时间,然后我可以计算工作时间

【问题讨论】:

您需要编写自己的函数来实现这一点,并结合您对什么构成“营业时间”、如何处理部分营业时间等的具体要求。 请分享样本输入和期望的结果 【参考方案1】:

一种方法是创建工作时间表。然后你可以运行一个相当简单的查询:

select
  t.id
  , sum(datediff(‘second’, 
               -- calculate the max of the two start time
               (case when t.start <= 
                          w.working_day_start_timestamp
                     then w.working_day_start_timestamp
                     else t.start
                end),
               -- calculate the min of the two end times
               (case when t.end >= 
                          w.working_day_end_timestamp
                     then w.working_day_end_timestamp
                     else t.end 
                end)
               )) / 3600 -- convert to hourly
  as working_hour_diff
from 
  working_days_times w,
  cross join time_intervals t
where -- select all intersecting intervals
  (
   t.start <= w.working_day_end_timestamp
   and
   t.end >= w.working_day_start_timestamp
  )
and -- select only working days
  w.is_working_day
group by
  t.id

如果你需要一个函数,这篇文章描述了一个 javascript UDF 在 Snowflake 中的实现: https://medium.com/dandy-engineering-blog/how-to-calculate-the-number-of-working-hours-between-two-timestamps-in-sql-b5696de66e51

【讨论】:

以上是关于雪花中两个日期之间的工作时间的主要内容,如果未能解决你的问题,请参考以下文章

雪花 - 在两个数组之间返回不同(不相似)的值

雪花,获取两个表之间不匹配列的列表(SQL)

SQL - 雪花减号运算符

如何在雪花中将时间戳转换为日期

雪花标量 UDF 返回 无法评估不支持的子查询类型

从雪花中的日期时间减去 2 小时